Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по СИИ.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
424.24 Кб
Скачать

Порядок предложений и целей.

Р :- Р.

Для декларативной семантики это норма, а процедурная уйдёт в бесконечность.

пред1 (X,Z) :- родитель (X,Z).

пред1 (X,Z) :- родитель (X,Y), пред1 (Y,Z).

пред2 (X,Z) :- родитель (X,Y), пред2 (Y,Z).

пред2 (X,Z) :- родитель (X,Z).

? пред2 (“Том”,”Пат”).

пред3 (X,Z) :- родитель (X,Z).

пред3 (X,Z) :- пред3 (Y,Z), родитель (X,Y).

? пред3 (“Том”,”Пат”).

Если спросить: ? пред3 (“Лиз”,”Джим”), то произойдёт зацикливание.

пред4 (X,Z) :- пред4 (Y,Z), родитель (X,Y).

пред4 (X,Z) :- родитель (X,Z).

? пред4 (“Том”,”Пат”).

Все 4 варианта имеют одинаковый декларативный смысл. Разница в процедурном.

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

В общем случае действует правило: сначала нужно пробовать самое простое соображение.

Списки.

Список – простая структура данных, представляющая собой последовательность, составленную из произвольного числа элементов. В виде стандартного объекта Пролога, список можно представить следующим образом:

атом [] – пустой список.

L=[a,b,c], если список не пуст Пролог всегда рассматривает список как структуру, состоящую из 2 частей:

  1. голова списка;

  2. остальная часть – хвост.

В общем случае головой может быть любой Пролог-объект, а хвост списком. Так как хвост – список, у него есть голова и хвост.

Если в качестве функтора структуры представленного списком выбрать точку, то в виде дерева список представляется следующим образом:

Элементами списка могут быть списки.

На практике часто бывает удобно трактовать хвост списка как самостоятельный объект. Список L тогда можно представить как:

L=[a|Hvost], где значение переменной Hvost=[b,c]. Таким образом, можно определить любое количество элементов списка.

Символом вертикальной черты можно определить любое количество элементов списка.

[a,b,c,d]=[a|[b,c,d]]=[a,b|[c,d]]=[a,b,c|[d]]=[a,b,c,d|[]]

Операции над списками.

Списки можно применять для представления множеств, хотя и существует некоторое различие между этими понятиями: порядок элементов множества не существенен, в то время как для списка этот порядок имеет значение. Кроме того, один и тот же элемент может встретиться в списке несколько раз.

1) Принадлежность к списку.

Цель: принадлежит(X,L) истинна, если элемент Х встречается в L. X – объект, L – список.

Истинно: принадлежит (b,[a,b,c])

принадлежит([b,c],[a,[b,c]])

Ложно: принадлежит(b,[a,[b,c]])

Будем основываться на следующем логическом утверждении:

1) Х есть голова L, либо

2) Х принадлежит хвосту L.

На Прологе:

принадлежит(X,[X|Hvost]).

принадлежит(X,[Golova|Hvost]) :- принадлежит(X,Hvost).

Задание: записать предикат принадлежит с использованием анонимной переменной.