3. Лабораторная работа по теме «Использование правил в языке Пролог»
Учебные цели: Приобретение умений и навыков чтения, модификации и разработки программ с фактами, правилами и секцией domains.
Порядок выполнения работы:
-
Изучить краткое теоретическое введение.
-
Выполните предложенные задания на компьютере из практической части.
-
Оформите отчет.
3.1. Краткое теоретическое введение
В языке Пролог используются правила для решения задач, где требуется определить истинность предиката (цели или подцели), которая зависит от истинности нескольких других предикатов (фактов), связанных между собой логическими условиями. В левой части правила всегда записывается только один предикат, истинность которого требуется установить. Эта часть правила называется его головой. После головы ставится логическая связка "если". В Прологе она обозначается словом if или знаком :-. За ней записываются предикаты, связанных между собой дизъюнкцией, конъюнкцией и отрицанием. Эта часть называется телом правила.
В языке Пролог логическая связка конъюнкции И обозначается словом AND или запятой, связка дизъюнкции ИЛИ - словом OR или разделением правила на несколько правил, логическое отрицание обозначается предшествующим словом NOT.
Приведем пример схематического изображения записи правил для предиката цели р(X,Y) и предикатов подцелей р1(X), р2(Y), p3(X), p4(Y):
p(X,Y) if (p1(X) and not p2(Y)) or (p3(X) and p4(Y)),
где
p(X,Y)- голова правила;
(p1(X) and not p2(Y)) or (p3(X) and p4(Y))- тело правила.
Альтернативная запись этого же правила в виде двух правил без использования дизъюнкции:
p(X,Y):- p1(X),not p2(Y).
p(X,Y):- p3(X),P4(Y).
При поиске решения Пролог делает попытку установить истинность логической формулы, которая представлена в виде тела правила, и определить значения переменных, при которых получено истинное значение. Если установлено истинное значение формулы в теле правила, то истинное значения получает и формула (предикат) в голове правила. Соответствующие переменные в голове правила становятся связанными, со значениями, полученными в процессе доказательства тела правила. При неудачной попытке доказательства Пролог производит поиск других правил с аналогичной головой.
В языке Пролог используются стандартные или встроенные предикаты. Встроенные предикаты не требуют их описания в секциях predicates и domains. В рассматриваемой программе будут применены предикаты вывода сообщений на экран и перевода курсора на следующую строку. Эти предикаты всегда имеют истинное значение:
-
write(список переменных и констант) - вывод на экран,
-
nl – перевод курсора на следующую строку.
3.2. Практическая часть
Задание 1.
Изучите структуру и особенности программы из примера 1.
Пример 1. Программа "Кто и что может купить?".
/* Программа "Кто и что может купить?". */
/* Демонстрация программы с правилом и фактами. Цель внутpенняя.*/
/* Использование раздела domains, связок ":-" и ",". */
domains
name,model=symbol
predicates
can_buy(name,model) /* может купить */
person(name) /* кто? */
car(model) /* автомобиль */
likes(name,model) /* нравится */
for_sale(model) /* имеется в продаже */
clauses
/* правило */
can_buy(X, Y) :- /* правила записываются в программу */
person(X), /* перед фактами или после них */
car(Y), /* факты и правила одного типа */
likes(X, Y), /* должны записываться в одной группе */
for_sale(Y).
/* факты */
person("Олег").
person("Владимир").
person("Игорь").
car("Таврия").
car("Жигули").
car("Мерседес").
likes("Олег","Жигули").
likes("Владимир","Таврия").
likes("Игорь","Мерседес").
for_sale("Жигули").
for_sale("Мерседес").
goal
can_buy(X,Y),write(X,"-",Y),nl.
В программе используются правила выбора машины, согласно требованиям покупателя и позволяет определить, кто и какую машину может купить с учетом своих желаний и наличия в продаже. В этой программе цель является внутренней и это значит, что всегда будет только одно первое найденное решение. Это может не устраивать покупателя. Внутренняя цель в программах на Прологе используется, где цель не изменяется и требуется одно решение. Измените цель, сделайте ее внешней, тогда программа будет выдавать все возможные варианты покупки автомобиля.
Обратите внимание на другую особенность программы: в структуре её появилась новая секция domains (область определения) для типов объектов, используемых в предикатах не относящихся к стандартным. Эта секция программы располагается перед секцией predicates. Сравните два возможных варианта фрагмента программы с описанием типов аргументов:
predicates can_buy (name,model) person (name) car (model) likes (name,model) for_sale (model)
|
predicates can_buy (symbol,symbol) person (symbor) car (symbol) likes (symbol) for_sale (symbol)
|
Таким образом, обеспечивается удобство чтения и понимания для пользователя смысла записываемых конструкций в программе без увеличения трудоемкости ее разработки. При использовании только стандартных типов аргументов включение в программу секции domains не обязательно. Но при использовании нестандартных типов, с которыми мы будем еще знакомиться, они должны иметь описание в этой секции. В строках секции domains при описании аргументов одного типа сначала через запятую записываются имена, затем ставится знак равенства и пишется значение типа.
В нашем случае эта запись будет иметь вид:
domains
name,model=symbol
Выполните на компьютере представленную программу. Модифицируйте программу для определения машин, приобретаемых Олегом, Игорем и Владимиром в соответствии с их желаниями. Сравните ожидаемые и полученные результаты.