Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2013_1 / ОТС / promet.pdf
Скачиваний:
104
Добавлен:
23.02.2015
Размер:
683.47 Кб
Скачать

consult(<имя файла>) или его аналогами. Вызов редактора произ­ водится предикатом edit(<имя файла>).

4.2.Данные и константы

Вязыке Пролог определены стандартные типы данных, соот­ ветствующие им константы и операции, приведенные в табл. 2.

Таблица 2

Типы данных в Прологе

Тип. Примеры

Turbo-Prolog

SWI-Prolog

констант

 

 

Integer

+ , – , * , mod , div , <=

+ , – , * , mod , // ,

–123; +763

, = , <> , >= , >

rem , < , =< , = , \= , >=

 

 

, > и другие

Real

+ , – , * , / , отношения

+ , – , * , ** , / , < , =< ,

1234.456; –12.34e+4

<, <= , = , <> , >= , >

= , \= , >= , > и другие

Symbol

peter; "roman pare"

peter; 'roman pare'

String

"Привет, ИПК!"

'Привет, ИПК!'

Из стандартных типов данных и констант можно конструировать составные данные или структуры, например, book("Программиро­ вание на языке Пролог", "Клоксин У., Мелиш К."), соответствующие описанию домена domains art = book(string, string).

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

[ 1, 2, 35, –47 ]

– типа integer*,

[ 'a', 'd', 't' ]

– типа char*,

[ "Петров И.С.", "Иванов С.П.", ""]

– типа string*,

[ ]

– пустой список.

В языке SWI-Prolog списки могут содержать элементы произ­ вольной природы, в том числе и списки. Для списков определена операция расщепления на головной элемент и остаток. Операция совмещает указанные объекты с имеющимся списком и записыва­ ется в форме [X | Y] , где X – объект, совмещаемый с головой

списка, Y – с остатком. Например, при совмещении двух списков List1 и List2 будут присвоены следующие значения.

List1

List2

Присваивания

[X, Y, Z]

[a1, b5, abc]

X=a1; Y=b5; Z=abc

[7]

[X | Y]

X=7; Y=[ ]

[1, 2, 3, 4]

[X, Y | Z]

X=1; Y=2; Z=[3, 4]

[1, 2]

[3 | 2]

неудача при совмещении

При описании предикатов знак “+” ставится у входного парамет­ ра, знак “–“ – у выходного, “?” – у входного или выходного. Следую­ щий фрагмент программы определяет предикат member(+Name, +List), проверяющий включение элемента Name в список:

member(Name, [Name|_]).

member(Name, [_|Tail]) :– member(Name,Tail).

Поиск максимального элемента A в списке List можно выпол­ нить обращением к предикату maxlist(-A, +List) , описываемому фрагментом:

maxlist(A,[B|Long]) :– not(pust(Long)), maxlist(C, Long), max(B, C, A). maxlist(A, [A|_]).

max(B, C, A) :– B > C, A = B. max(_, C, C).

pust([ ]).

Поиск N-го элемента в списке List задается предикатом givel(+List, +N, -X) :

givel([ ], _, _) :– !, fail. givel([Y|_], 1, Y).

givel([_|Tail], N, Y) :– N1=N–1, givel(Tail, N1, Y).

Добавление в список ListIn N-го элемента X и получение списка ListOut предикатом putel(+ListIn, -ListOut, +N, +X):

putel([ ], [X], _, X). putel(List, [X|List], 1, X).

putel([Y|Tail], [Y|L2], N, Y) :– N1=N–1, putel(Tail, L2, N1, X). Сцепление списков можно выполнить предикатом append (+L1,

+L2, -L3):

append([ ], L2, L2).

Соседние файлы в папке ОТС