Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Шумихин / Шумихин / Шумихин - лекция 4

.txt
Скачиваний:
7
Добавлен:
20.05.2015
Размер:
8.89 Кб
Скачать
ЛЕКЦИЯ 4
28.09.12

Анонимная переменная:
Если в ходе выполнения задания значение некой переменной нам не важно, то зачем ей присваивать имя? Для таких случаев используется анонимная переменная.

Как только процедура унификации завершена, и мы переходим к следующим объектам (предложению), ненужные нам переменные освобождаются.

Факты в Прологе
Факт -- некое утверждение, которое не требует доказательства. Эти утверждения могут быть самыми разными по интерпретации. Факты интерпретируются либо как связь между объектами, либо как отношение между объектами, либо как свойство объекта.
В конце каждого факта ставится точка.

Примеры фактов:
likes(bill, kat). связь между объектами/отношение между объектами
собака(бобик). свойство объекта

Множество фактов представляет собой некоторую базу данных программы на Прологе.

Правила в Прологе

имеет_собаку(Некто) :-
имеет(Некто, Нечто),
собака(Нечто).
(Чтобы Некто имел собаку, необходимо, чтобы Некто имел Нечто и это Нечто было собакой.)

Каждое правило завершается точкой.
Запятая интерпретируется как логическое "и".

Механизм работы Пролога
Дерево, точки возврата в вершинах "или", если на одной ветке нет решения, возвращаемся к ближайшей точке возврата, идём по другой ветке. При этом все переменные нижней части освобождаются.

Правила можно интерпретировать так:
Для того чтобы выполнить что-то, надо выполнить такие-то и такие-то действия.

Пример
мужчина(иван).
мужчина(пётр).
...
женщина(татьяна).
...
родитель(пётр, иван).
...

Чтобы Пролог-системе не пришлось просматривать всю базу фактов, чтобы понять, есть альтернативы или нет, во всех версиях пролога реализовано следующее правило:
Все факты и все правила, касающиеся одного предиката, должны быть собраны в одном месте.

В примере: все факты и правила, касающиеся мужчины, должны идти подряд.
Пролог смотрит первый факт. Если сопоставление удачно, всё закончилосль. Если неудачно, он переходит к следующему факту. Если факт имеет другое имя, автоматически считается, что удачных сопоставлений нет.

Порядок следования фактов и правил для одного предиката безразличен.
Пролог посматривает факты и правила, касающиеся определённого предиката, в определённом порядке. Иногда это бывает принципиально важно.
Наверх имеет смысл помещать те факты и правила, которые будут доказаны в первую очередь и быстрее всего приведут к решению.

Пример 2
отец(Х, У) :- мужчина(Х), родитель(Х, У).

Запрос 1:
отец(Х, У)

Пролог выдаст примерно следующее:
Х = пётр, У = иван
Х = семён, У = татьяна
...
10 решений Yes

Запрос 2:
отец(Х, петр)
Пролог выдаст список всех отцов Петра.

Если Пролог говорит, что у Петра нет отца, это значит только, что из набора фактов и правил, которыми располагает на данный момент Пролог, эту информацию получить невозможно.

Запрос 3:
отец(татьяна, пётр)
Интерпретируется как: правда ли, что татьяна является отцом петра?

Ответ Пролога:
No

брат(Х, У) :- мужчина(Х), родитель(Z, X), родитель(Z, Y)
бабушка(X, Y) :- женщина(X), родитель(X, Z), родитель(Z, Y)
бабушка(X, Y) :- мать(X, Z), родитель(Z, Y)

тётя(X, Y) :- сестра(X, Z), родитель(Z, Y)
тётя(X, Y) :- женщина(X), родитель(Z, X), родитель(Z, W), родитель(W, Y)

сестра(X, Y) :- женщина(X), родитель(Z, X), родитель(Z, Y)
мать(X, Y) :- женщина(X), родитель(X, Y)
_______________________________

Программа состоит из секций. Секции могут следовать в произвольном порядке. Секции с одинаковым функциональным значением могут располагаться в разных частях программы, их может быть несколько.
TurboProlog и VisualProlog контролируют тип. SWI-Prolog определяет тип автоматически.

Вследствие этого в TP и VP есть несколько секций, аналогичных секциям для типов переменных, процедур и т.п. Это не правило с точки зрения логического программирования, это некое движение в сторону соединения логического и декларативного программирования.

Всё рассказываемое будет на TurboProlog.

Состав секций TurboProlog.
Каждая секция начинается со служебного слова:
- domains -- предназанчена для описания типов (объявления доменов)
- predicates -- секция предикатов, предназначена для описания используемых предикатов
- clauses -- факты и правила (описываются, как показано выше)
- goal -- (Turbo и Visual) может быть только одна, в ней пишется запрос. Если запрос имеется, цель называется внутренней. В таком случае TP выдаёт первое найденное решение. Если в TP этой секции нет, то тогда в диалоговом режиме нас просят ввести запрос, в том же формате, что и в секции "цель". Эта цель называется внешней и в ответ на эапрос, который является внешней целью, TP выдаёт все возможные решения. Почти всегда будем по умолчанию считать, что цель является внешней.

Наличие любой из секций не обязательно.

Примеры

domains
int = integer
Есть встроенные домены, о них позже.

predicates
p(int)
p(int, real)
(имя предиката и в скобках домены его аргументов)

В некоммерческой версии TP наличие секции goal является обязательным, ибо внешние цели отключены. Есть режим тестирования цели.
___________________________________________________