Представление знаний в интеллектуальных системах
Методическое пособие - Компьютеры, программирование
Другие методички по предмету Компьютеры, программирование
перация паросочетания вообще не должна быть симметричной в том смысле, что она связывает заключение (объект-цель) с гипотезами (объектами-фактами). Объект-цель паросочетается с объектом-фактом, если влекущая объект-цель логическая формула унифицируется с одним из сомножителей объекта-факта, представленного конъюнкцией гипотез и аксиом.
В терминах доказательства теорем это означает, что операция паросочетания может осуществляться тогда и только тогда, когда цель можно доказать из гипотез и аксиом.
Рассмотрим фрейм-гипотезу
Посылка_8
элем : (элем_из посылок)
отправитель : Жак_2
получатель : Мари_4
объект : Книга_22
Можно установить паросочетание этого фрейма-факта с фреймом-целью
z(x)
элем : (элем_из посылок)
отправитель : Жак_2
получатель : х
объект : у(х)
Фрейм-цель интерпретируется как вопрос: Кому Жак послал книгу? Паросочетание фрейма-цели и фрейма-факта приводит к подстановке {(z, Посылка_8) , (х, Мари_4), (у, Книга_22)}, которую можно интерпретировать как ответ на вопрос.
38.Язык Prolog. Некоторые операции над списками
Наиболее часто используемые операции над списками аналогичны операциям над множествами.
проверка, является ли некоторый объект элементом списка;
конкатенация (сцепление) двух списков, что соответствует объединению множеств;
добавление некоторого объекта в список или удаление некоторого объекта из него.
Принадлежность к списку
Мы представим отношение принадлежности как
принадлежит ( Х, L)
где Х - объект, а L - список. Цель принадлежит ( Х, L) истинна, если элемент Х встречается в L. Например, верно что
принадлежит ( b, [a, b,c])
и наоборот, не верно, что
принадлежит ( b, [a, [b,c] ])
но
принадлежит ( [b,c], [a, [b,c] ])
истинно.
Составление программы для отношения принадлежности может быть основано на следующих соображениях:
1)Х есть голова L, либо
2)Х принадлежит хвосту L.
Это можно записать в виде двух предложений, первое из которых есть простой факт, а второе правило:
принадлежит (Х, [Х | Хвост] ).
принадлежит (Х, [Голова | Хвост] ) :-
принадлежит (Х, Хвост).
Сцепление (конкатенация)
Для сцепления списков мы определим отношение
конк( L1, L2, L3)
Здесь L1 и L2 два списка, а L3 - список, получаемый при их сцеплении. Например,
конк( [a, b], [c, d], [a,b,c,d])
истинно, а
конк( [a, b], [c, d], [a,b, а. c,d])
ложно.
Определение отношения конк, как и раньше, содержит два случая в зависимости от вида первого аргумента L1:
1)Если первый пуст, тогда второй и третий аргумент представляют собой один и тот же список (назовем его L), что выражается в виде следующего прологовского факта:
конк ([], L, L)
2)Если первый аргумент отношения конк не пуст, то он имеет голову и хвост и выглядит так
[X | L1]
Хотя программа для конк выглядит довольно просто, она обладает большой гибкостью и ее можно использовать многими другими способами. Например, ее можно применить как бы в обратном направлении для разбиения заданного списка на две части:
? - конк (L1, L2, [a, b, c] )= []=[a, b, c];= [a]=[b, c];=[a,b]2=[c];
L1=[a,b,c]
L2=[];
no
Список [a, b, c] разбивается на два списка четырьмя способами, и все они были обнаружены нашей программой при помощи механизма автоматического перебора.
Нашу программу можно также применить для поиска в списке комбинации элементов, отвечающей некоторому условию, задаваемому в виде шаблона или образца. Например, можно найти все месяцы, предшествующие данному, и все месяцы, следующие за ним, сформулировав такую цель:
? - конк ( До, [май | После], [янв, фев, март, апр, май, июнь, июль, авг, сент, окт, ноябрь, дек]).
До=[янв, фев, март, апр]
После = [июнь, июль, авг, сент, окт, ноябрь, дек]
Далее мы сможем найти месяц, непосредственно предшествующий маю, и месяц, непосредственно следующий за ним, задав вопрос
?- конк(_, [Мсяц1, май, Месяц2 | _],[янв, фев, март, апр, май, июнь, июль, авг, сент, окт, ноябрь, дек])
Месяц1 = апр
Месяц2 = июнь
Более того, мы сможем, например, удалить из некоторого списка L1 все, что следует за тремя последовательными вхождениями элемента z в L1 вместе с этими тремя z. Например, это можно сделать так
? - L1 = [a, b, z,z, c,z, z, z, d, e],
конк (L2, [z, z, z | _ ], L1).= [a, b, z,z, c,z, z, z, d, e],
L2 = [a, b, z,z, c]
Мы уже запрограммировали отношение принадлежности. Однако, используя конк, можно было бы определить это отношение следующим эквивалентным способом:
принадлежит1( X, L) :-
конк(L1, [X |L2], L).
В этом предложении сказано: Х принадлежит L, если список L можно разбить на два списка таким образом, чтобы элемент Х являлся головой второго из них. Разумеется принадлежит1 определяет то же самое отношение, что и принадлежит. Мы использовали другое имя только для того, чтобы различать таким образом реализации этого отношения. Заметим, что используя анонимную переменную, можно записать вышеприведенное предложение так
принадлежит1( X, L) :-
конк(_, [X |_], L).
Добавление элемента.
Наиболее простой способ добавить элемент в список - это вставить его в самое начало так, чтобы он стал его новой головой. Если Х - это новый элемент, а список, в который Х добавляется - L, тогда результирующий список - это просто
[X | L]
Таким образом, для того чтобы добавить новый элемент в начало списка, не надо использовать никакой процедуры. Тем не менее, если мы хотим определить такую процедуру в явном виде, то ее можно представить в форме такого факта:
добавить(Х , L, [X | L] ).
Удаление элемента
Удаление элемента Х из списка L можно запрограммироват?/p>