У Клоксин - ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ
- Название:ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
У Клоксин - ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ краткое содержание
Книга английских специалистов, содержащая описание основ логического программирования и особенностей языка Пролог – базового языка ЭВМ пятого поколения. Области применения этого языка связаны с разработкой экспертных систем, интеллектуальных баз данных, обработкой естественного языка, разработкой компиляторов ЭВМ. Книга полезна для первого ознакомления с языком Пролог.
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
?- копирование(sentence(np(n(john)), v(eats)),X).
X = sentence(_23,_24)
Мы используем подобную комбинацию целевых утверждений functorв определении предиката reconsultв разд. 7.13.
Предикат argвсегда должен использоваться с конкретизированными первым и вторым аргументами. Он применяется для доступа к конкретному аргументу структуры. Первый аргумент предиката argопределяет, какой аргумент структуры необходим. Второй аргумент определяет структуру, к аргументу которой необходим доступ. Пролог находит соответствующий аргумент и затем пытается сопоставить его с третьим аргументом предиката arg.Таким образом, цель arg(N,T,A)согласуется с базой данных, если N-й аргумент Тесть А. Давайте рассмотрим несколько целевых утверждений с arg.
?- аrg(2,отношение(джон,мать(джейн)),Х).
X = мать(джейн)
?- arg(1,a+(b+c),X).
X =а
?- arg(2,[a,b,c],X).
X = [b,c]
?-arg(l,a+(b+c),b).
нет
Иногда мы захотим использовать предикаты functorи argв ситуации, когда возможные структуры уже известны. Это связано с тем, что структура может иметь так много аргументов, что просто неудобно каждый раз перечислять их все. Рассмотрим пример, в котором структуры используются для описания книг. Мы могли бы иметь отдельную компоненту для названия книги, ее автора, издательства, года издания и так далее. Будем считать, что результирующая структура имеет четырнадцать компонент. Мы могли бы написать следующие полезные определения:
является _ книгой(книга(_,_,_,_,_,_,_,_,_,_,_,_,_,_)).
название(книга(Т,_,_,_,_,_,_,_,_,_,_,_,_,_),Т).
автор(книга(_,А,_,_,_,_,_,_,_,_,_,_,_,_),А).
. . .
В действительности мы можем записать это значительно более компактно следующим образом:
является_книгой(Х):- functor(X, книга, 14).
название(Х,Т):- является_книгой(Х), arg(1,X,T).
автор(Х,А):- является_книгой(Х), arg(2,X,T).
. . .
Предикаты functorи argдают один из способов создания произвольных структур и доступа к их аргументам. Предикат «=..» предоставляет альтернативный способ, полезный в том случае, когда необходимо одновременно получить все аргументы структуры или создать структуру по заданному списку ее аргументов. Целевое утверждение X=..Lозначает, что L есть список, состоящий из функтора структуры X, за которым следуют аргументы X. Такое целевое утверждение может быть использовано двумя способами, так же как и целевое утверждение functor.Если Xуже имеет значение, то Пролог создает соответствующий список и пытается сопоставить его с L. Напротив, если Xнеконкретизировано, то список будет использован для формирования соответствующей структуры, которая станет значением X. В этом случае голова списка должна быть атомом (этот атом станет функтором X). Ниже приведено несколько примеров целевых утверждений, содержащих =..:
?- имя(а,b,с) =.. X.
X = [имя,а,b,с]
?- присоединить([А|В],С, [A|D]) =..L.
A = _2, В = _3, С = _4, D = _5, L = [присоединить,[_2|_3],_4,[_2|_5]]
?- [a,b,c,d] =..L.
L = ['.',a,[b,c,d]].
?- (a+b) =.. L.
L = [+,a,b].
?- (a+b) =..
[+,A,B] A = а, В = b
?- [a,b,c,d] =..
[A|B] A = '.', В = [a,[b,c,d]]
?- X =.. [a,b,c,d]
X = a(b,c,d).
?- X =.. [присоединить,[a,b,],[c],[a,b,c]].
X = присоединить([а,b],[с],[а,b,с])
Примеры использования предиката =.. приведены в разд. 7.12.
В то время как предикаты functor, argи =..используются для формирования произвольных структур и доступа к их аргументам, предикат nameиспользуется для работы с произвольными атомами. Предикат nameсопоставляет атому список литер (их ASCII кодов), из которых состоит этот атом. Данный предикат можно использовать как для определения литер, составляющих указанный атом, так и для определения атома, содержащего заданные литеры. Целевое утверждение name(A, L)означает, что литеры, образующие атом А, являются элементами списка L. Если аргументу А уже присвоено значение, то Пролог создает список литер и пытается сопоставить его с L. В противном случае Пролог использует список Lдля создания атома, который станет значением А. Приведем примеры использования предиката name:
?- name(apple,X).
X = [97,112,112,108,100]
?- name(X,[97,l12,112,108,100]).
X = apple
?- name(apple,"apple").
да
?- name(apple,"pear").
нет
В разд. 9.5 предикат nameиспользуется для доступа к внутренней структуре слов английского языка, представляемых атомами Пролога.
6.6. Воздействие на процесс возврата
В Прологе есть два встроенных предиката, изменяющих нормальную последовательность событий, происходящих в процессе возврата. Предикат « !» устраняет возможности для повторного согласования целевых утверждений, а предикат repeatсоздает новые альтернативы там, где их не было ранее.
Символ отсечения ('!') можно рассматривать как встроенный предикат, который лишает Пролог-систему возможности изменить некоторые из решений, принятых ею ранее. Более подробное описание отсечения смотрите в гл. 4.
Встроенный предикат repeatобеспечивает дополнительную возможность для порождения множественных решений в процессе возврата. Хотя он и является встроенным, его поведение полностью соответствует следующему определению:
repeat.
repeat:- repeat.
Что произойдет, если мы поместим предикат repeatкак целевое утверждение в одно из наших правил?
Во-первых, это целевое утверждение согласуется с базой данных, так как имеется соответствующий факт – первое утверждение определения предиката repeat.Во-вторых, если в процессе возврата вновь будет достигнуто это место, то Пролог будет иметь возможность испробовать альтернативу – правило (второе утверждение). При использовании правила порождается другое целевое утверждение repeat.Так как оно сопоставляется с фактом для предиката repeat,то это целевое утверждение вновь согласуется с базой данных. Если процесс возврата снова дойдет до этого места, то Пролог вновь использует правило там, где он ранее использовал факт. Чтобы доказать согласованность вновь порожденного целевого утверждения, он снова выберет факт. И так далее. В действительности в процессе возврата целевое утверждение repeatможет быть согласовано бесконечное число раз. Обратим внимание на существенность порядка, в котором записаны утверждения для предиката repeat.(Что произойдет, если факт будет записан после правила?)
Для чего нужно порождать целевые утверждения, которые всегда будут согласовываться в процессе возврата? Они нужны для того, чтобы создавать правила, в которых имеется возможность выбора вариантов, из правил, которые такой возможности не содержат. И тем самым мы можем заставить их порождать каждый раз различные значения.
Читать дальшеИнтервал:
Закладка: