Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prolog.doc
Скачиваний:
31
Добавлен:
12.03.2015
Размер:
929.28 Кб
Скачать

6.6. Операторы объявления

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

op(P,S,N)

Здесь Р - приоритет оператора, S - спецификатор, а N - имя ато­ма, который будет использоваться в качестве главного функтора в со­ответствующей структуре.

Пролог имеет ряд встроенных операторов, которые перечислены в конце главы. Все они определены так, как если бы для каждого объ­явления было успешно выполнено целевое утверждение

?- op(P,S,N).

Покажем на примере, как можно написать оператор для преобра­зования температуры по Цельсию в температуру по Фаренгейту. Сначала зададим предикат, который преобразует температуру С(по Цельсию) в температуруF(по Фаренгейту).

(consult)

/* приглашение пользователю ввести предложение:

?- [user]

/* ввод предложения

:t(C,F) :- F is (С*9/5+32).

:$ /* окончание работы пользователя

Теперь объявим предикат t как инфиксный левоассоциативный оператор с приоритетом 100:

?- op(100,yfx,t).

Если в программе на Прологе возникает необходимость преобра­зования температуры, то надо только включить целевое утвержде­ние с оператором t и двумя аргументами: переменной С, конкретизи­рованной некоторым целым числом, и неозначенной переменной F.

Например:

tabulate(C,F) :- write(C),tab(3),C t F, tab(3),write(F).

6.7. Пример: вычисление многочленов

В предыдущей главе мы использовали представление многочлена в виде списка термов. Для создания более удобного представления воспользуемся операторной формой записи. Объявим 'х' как инфикс­ный оператор:

:- op(550,xfx,x).

Теперь многочлены

1+3х^2-2х^4+х^5

записываются в виде

1х0+3х2-2х4+1х5.

Операторы + и - объявлены как

:- op(500,yfx,+).

:- op(500,yfx,-).

Применяя эти объявления, процедуру вычисления многочлена можно записать следующим образом:

вычислить(CxP,X,V) :-

степень_быстро(Х,P,ХP),

V is l*XP.

вычислить(P+Q,X,V) :-

вычислить(P,X,Vp),

вычислить(Q,X,Vq),

V is Vp + Vq.

вычислить(P-Q,Х,V) :-

вычислить(P,X,Vp),

вычислить(Q,X,Vp),

V is Vp - Vq.

где степень_быстро - процедура, определенная в разд. 5.4. Конечно, если в вашей реализации Пролога имеется экспоненциальный опера­тор, вы можете использовать его вместо степень_быстро.

Обратившись к системе с запросом

?- вычислить(1*0+3*2-2*4+1*5-1,V).

получим:

V=1.

6.8. Системные операторы

Обычно в реализации языка Пролог системные операторы, их позиция / ассоциативность и приоритет объявляются следующим обра­зом:

Имя

Спецификатор

Приоритет

:-

xfx

1200

?-

fx

1200

;

xfy

1100

, xfy

1000

spy

fx

900

nospy

fx

900

not

fx

800

.

xfv

750

=..

xfx

700

=

xfx

700

\=

xfx

700

is

xfx

700

=:=

xfx

700

=\=

xfx

700

<

xfx

700

= <

xfx

700

>

xfx

700

> =

xfx

700

= =

xfx

700

\= =

xfx

700

-

yfx

500

+

yfx

500

/

yfx

400

*

yfx

400

div

yfx

400

mod

xfx

300

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]