Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаба_3.rtf
Скачиваний:
28
Добавлен:
27.03.2015
Размер:
127.32 Кб
Скачать

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

Выполните на компьютере представленную программу. Модифицируйте программу для определения машин, приобретаемых Олегом, Игорем и Владимиром в соответствии с их желаниями. Сравните ожидаемые и полученные результаты.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]