описание фактов и правил, описывающих отношения (clauses). Имена объектов (констант) в ПРОЛОГе пишутся с маленькой буквы,
а переменных – с большой.
Рассмотрим, как можно описать на ПРОЛОГе задачу из некоторой предметной области, например географии.
Программа 1
DOMAINS
gorod, strana = symbol PREDICATES
situ(gorod,strana) CLAUSES
situ (london, england). situ (petersburg, russia). situ (kiev, ukraine). situ (pekin, asia).
situ (warszawa, poland). situ (berlin, europe).
situ (X, europe):- situ (X, russia). situ (X, europe):- situ (X, poland).
Выражение
situ(kiev, ukraine)
описывает тот факт, что город Киев находится на Украине. Ранее в программе был введен соответствующий предикат, работающий с объектами символьного типа. Название города и страны здесь являются константами, поэтому по правилам ПРОЛОГа их нужно писать с маленькой буквы. Вместо блока определений:
DOMAINS
gorod, strana = symbol PREDICATES
situ(gorod,strana)
можно было просто описать предикат: PREDICATES
situ(symbol, symbol)
Иногда первый вариант предпочтительнее, поскольку позволяет оценивать семантический смысл аргументов предиката.
В конце раздела clauses Программы 1 описаны два правила. Правило задает новый предикат через предикаты, определенные ранее. Правило 6
состоит из головы (предиката) и тела – последовательности предикатов. Голова отделяется от тела значком :- , который можно интерпретировать как слово «Если». Таким образом, заключение является головой правила, а тело правила состоит из набора посылок.
Использование правил является основным способом представления знаний в интеллектуальных системах.
Смысл правила состоит в том, что цель, являющаяся головой, будет истинной, если интерпретатор ПРОЛОГа сможет показать, что все выражения (подцели) в теле правила являются истинными.
В правилах буква X (или любая другая заглавная буква, или любое слово, начинающееся с заглавной буквы) обозначает переменную, которая может принимать разные значения.
Так, правило
situ (X, europe):- situ (X, poland)
означает, что любой польский город является одновременно европейским городом. Добавлением новых правил можно пополнять и модифицировать описание задачи. Если мы хотим описать тот факт, что все города Франции являются одновременно европейскими городами, то достаточно добавить всего одно правило
situ (X, europe):- situ (X, france)
и можно будет по-прежнему использовать все остальные факты о городах Европы.
В ПРОЛОГе можно использовать составные объекты. Составные объекты позволяют описывать иерархические структуры, в которых описание одного предиката включает в себя описание других предикатов.
Например:
Программа 2
DOMAINS personal_library=book(title,author,publication) publication= publication(publisher,year)
collector,title,author,publisher=symbol
year=integer PREDICATES
collection(collector, personal_library)
7
CLAUSES
collection(“Иванов”,book(“Война и мир”, “Лев Толстой”, publication(“Просвещение”,1990))).
При описании правил часто возникает необходимость использовать логические связки И и ИЛИ. В качестве связки И используется запятая, а в качестве связки ИЛИ – точка с запятой. Например:
gigant(X) :- rost(X,Y),Y>200.
star_or_mlad(X) :- X>70; X<10.
ПРОЛОГ имеет большое количество встроенных предикатов, т.е. предикаты, определяемые автоматически. Например, встроенный предикат nl вызывает перевод строки, а встроенный предикат write применяется для вывода информации на экран. Встроенные предикаты используются так же, как и определяемые пользователем предикаты, но встроенный предикат не может являться головой правила или появляться в факте.
Часто используемыми встроенными предикатами являются = (унификация) и логическое отрицание not. Например:
student(X) :- X=”Петров”; X=”Иванов”.
xor_student(X) :- not(X=”Петров”), not(X=”Иванов”).
planeta(X) :- not(X=”солнце”).
Утверждение not(X = Y) эквивалентно X<>Y.
Иногда бывает полезно использовать предикаты, про которые заранее известно, истинны они или ложны. Для этих целей используют предикаты true и fail. Предикат true всегда истинен, в то время как fail всегда ложен. Последний предикат используется для управления процессом решения задачи на ПРОЛОГе.
ПРОЛОГ-программа может использовать комментарии, которые не влияют на выполнение программы, но могут оказать помощь человеку, читающему программу. ПРОЛОГ игнорирует произвольное число строк, заключенное между символами /* и */. Все, что находится между % и концом строки, также рассматривается как комментарий:
/* Здесь записан комментарий */
% Это тоже комментарий
8
При описании конкретной предметной области обычно имеется набор исходных фактов и правдоподобных допущений, на основании которых формулируются правила.
Рассмотрим, каким образом на ПРОЛОГе можно описать задачу о семейных отношениях.
Пусть имеются факты об отцовстве:
1)Иван – отец Игоря.
2)Иван – отец Сидора.
3)Сидор – отец Лизы. Введем также три предиката:
Мужчина (x), означающий, что x – мужчина, Единокровный (x,y), означающий единокровность x и y, Брат (x,y), означающий, что x брат y.
Справедливы, очевидно, следующие правила:
1)«Все отцы – мужчины».
2)«Если у детей один отец, то они единокровны».
3)«Брат – это единокровный мужчина». Рассмотрим вывод решения при ответе на вопрос: «Есть ли братья у Игоря?».
Программа 3
DOMAINS
person = symbol PREDICATES
otec(person,person)
man(person)
brat(person,person) CLAUSES
man(X):-otec(X,_). brat(X,Y):-otec(Z,Y),otec(Z,X),man(X),X<>Y. otec(ivan,igor). otec(ivan,sidor). otec(sidor,lisa).
Во втором правиле программы указано условие X<>Y. Это позволяет описать ПРОЛОГ-программе тот факт, что человек не может быть собственным братом.
После запроса
goal: brat(igor,X) Система выдаст
X = sidor
9
Это отвечает нашим представлениям о правильном решении. Приведенные примеры примитивны, но они позволяют представить
неожиданность и полезность решений, которые может сгенерировать ПРОЛОГ при большом количестве фактов и правил в сложной предметной области.
3.ОПИСАНИЕ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ
Вязыке ПРОЛОГ используется ряд встроенных функций для вычисления арифметических выражений, некоторые из которых перечислены
втабл. 1.
|
Таблица 1 |
|
|
Обозначение |
Тип операции |
|
|
>,<,=,>=,<=,<> |
Операции сравнения |
|
|
+, -, *, / |
Арифметические операции |
|
|
X mod Y |
Остаток от деления X на Y |
|
|
X div Y |
Частное от деления X на Y |
|
|
abs(X) |
Абсолютная величина числа X |
|
|
sqrt(X) |
Квадратный корень из X |
|
|
sin(X), cos(X), tan(X), arctan(X) |
Тригонометрические функции |
|
|
exp(X) |
Возведение в степень X |
|
|
log(X) |
Десятичный логарифм (ln) числа X |
|
|
ln(X) |
Натуральный логарифм числа X |
|
|
Для описания любых операций арифметики можно также использовать собственные предикаты. Например:
Программа 4
PREDICATES add(integer,integer) fadd(real,real) maximum(real,real,real)
CLAUSES
add(X,Y):-Z=X+Y,write(“Sum= “,Z),nl. fadd(X,Y):-Z=X+Y,write(“FSum= “,Z),nl. maximum(X,X,X).
maximum(X,Y,X):- X>Y.
10