дХОКНЛМШЕ ПЮАНРШ, ЙСПЯНБШЕ ОПНЕЙРШ МЮ ГЮЙЮГ, ЙНМРПНКЭМШЕ ПЮАНРШ МЮ ГЮЙЮГ

 

мЮВЕПРЮРЕКЭМЮЪ ЦЕНЛЕРПХЪ оПЮЙРХЙСЛ ОН ПЕЬЕМХЧ ГЮДЮВ цЕНЛЕРПХВЕЯЙНЕ ВЕПВЕМХЕ хМФЕМЕПМЮЪ ЦПЮТХЙЮ еяйд йПЮРМШЕ ХМРЕЦПЮКШ лЮРЕЛЮРХВЕЯЙХИ ЮМЮКХГ лЮРПХЖШ оПЕДЕКШ оПНХГБНДМШЕ бЕЙРНПМЮЪ ЮКЦЕАПЮ хМРЕЦПЮКЭМНЕ ХЯВХЯКЕМХЕ ртйо ъДЕПМЮЪ ТХГХЙЮ щКЕЙРПНЯРЮРХЙЮ лЮЦМЕРХГЛ нОРХЙЮ хМТНПЛЮЖХНММШЕ РЕУМНКНЦХХ

Предыдущий разделУровень вышеСледующий раздел

Базы знаний

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

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

Одним из наиболее часто используемых встроенных предикатов является предикат not/1 (отрицание). Этот предикат истиннен, если его аргумент ложен, и наоборот. Можно использовать и другую форму записи данного предиката \+.


Пример
Если мы определим правило

 ложь(X) 
:- not(X). ложь1(X) :- \+(X). 
то следующие запросы будут эквивалентны:
 
?- not(больше(собака, лошадь)). Yes; ?- ложь(больше(собака, лошадь)). Yes 

Другим часто используемым встроенным предикатом является =/2 (унификация): =(X, Y). Этот предикат допускает более удобную форму записи X = Y. Значение этого предиката истинно, если термы X и Y удается унифицировать.

На предикат not/1 похож встроенный предикат \=, зависящий от двух аргументов. Утверждение X \= Y эквивалентно утверждению not(X = Y).

Иногда бывает полезно использовать предикаты, про которые заранее известно, истинны они или ложны. Для этих целей используют предикаты true/0 и fail/0. Предикат true всегда истинен, в то время как fail всегда ложен.

Встроенный предикат read/1 позволяет считывать термы с клавиатуры. При этом приглашение Пролога ?- меняется на |:. Вводимый терм должен обязательно заканчиваться точкой.


Пример

 ?- read(Name), read(Age). |: коля. 15. Name = коля Age = 15 Yes ?- read(X), 
больше_2(X,Y). |: осел. X = осел Y = собака ; X = осел Y = обезьяна ; No 

Если при обработке запросов Пролога вы пожелаете получить более подробный вывод, то для этих целей можно использовать предикат write/1. Аргументом этого предиката может являться любой допустимый терм Пролога. В случае, когда аргументом является переменная, будет напечатано ее значение.

Выполнение предиката nl/0 осуществляет перевод строки: последующий вывод начнется с новой строки. Предикат tab/1 выводит количество пробелов, определяемое его аргументом.


Пример

 ?- write('Hello World!'). Hello World! Yes ?- write('Hello'), nl, tab(5), 
write('World!'). Hello World! Yes ?- X = слон, write(X), nl. слон X = слон Yes 

В последнем примере сначала переменная X унифицируется с атомом слон, а затем значение переменнойX, т. е. слон, выводится на экран при помощи предиката write/1. После перехода на новую строку Пролог выдает отчет об унифицированной переменной, т. е. печатает X = слон.

Большинство Пролог-систем предоставляет доступ к справочной информации при вызове предиката help/1. Примененный к терму (обычно представляющему имя встроенного предиката) он осуществляет вывод краткого описания этого терма.


Пример

 ?- help(write). write(+Term) Write Term to the current 
output, using brackets and operators where appropriate. See feature/2 for contrillong 
floating point output format. write(+Stream, +Term) Write Term to Stream. Yes 

И, напоследок, поговорим о комментариях. Комментарии никак не влияют на выполнение программы, но при правильном их использовании они оказываются весьма существенной частью исходного текста. Несколько удачно расположенных строк с комментариями могут оказать человеку, читающему программу, большую помощь. Пролог игнорирует произвольное число строк, заключенное между символами /* и */. Все, что находится между % и концом строки, также рассматривается как комментарий:


Пример

 /* Это комментарий */ % Это тоже комментарий 

Предыдущий разделУровень вышеСледующий раздел