
- •Введение.
- •Фундаментальные подходы к познанию ис.
- •Синергетический подход.
- •Информационный подход.
- •Знания.
- •Свойства знаний.
- •Классификация знаний.
- •Модели представления знаний в сии.
- •Предикатная модель представления знаний.
- •Редукционная модель представления знаний.
- •Процедурные модели представления знаний.
- •Специальные модели представления знаний. Семантические сети.
- •Фреймовая модель представления знаний.
- •Экспертные системы в сии.
- •Архитектуры экспертной системы как сии.
- •Функциональная схема экспертной системы.
- •Технология разработки экспертных систем.
- •Общий обзор языка prolog на примере конкретной программы.
- •Пример программы.
- •Рекурсивное определение правил.
- •Поиск Пролог-системой ответа на вопрос.
- •Декларативный и процедурный смысл программы.
- •Декларативная семантика Пролог-системы.
- •Процедурная семантика Пролог-программы.
- •Порядок предложений и целей.
- •Списки.
- •Операции над списками.
- •1) Принадлежность к списку.
- •2) Добавление элемента.
- •3) Удаление элемента.
- •4) Сцепление (конкатенация) списков.
- •Управление перебором в Пролог-системе.
- •Решение головоломок методом «образовать и проверить».
Порядок предложений и целей.
Р :- Р.
Для декларативной семантики это норма, а процедурная уйдёт в бесконечность.
пред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 частей:
голова списка;
остальная часть – хвост.
В общем случае головой может быть любой Пролог-объект, а хвост списком. Так как хвост – список, у него есть голова и хвост.
Если в качестве функтора структуры представленного списком выбрать точку, то в виде дерева список представляется следующим образом:
Элементами списка могут быть списки.
На практике часто бывает удобно трактовать хвост списка как самостоятельный объект. Список 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).
Задание: записать предикат принадлежит с использованием анонимной переменной.