Материал: Методическое пособие по Turbo Prolog (новое)

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

описание фактов и правил, описывающих отношения (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