
- •1. ИСПОЛЬЗОВАНИЕ ЯЗЫКА ПРОЛОГ
- •2. ЛОГИЧЕСКИЕ ОСНОВЫ ЯЗЫКА ПРОЛОГ
- •2.1. Представление знаний и фактов
- •2.2. Исчисления логического типа
- •2.3. Исчисление резольвент
- •3. МЕХАНИЗМ РАБОТЫ ИНТЕРПРЕТАТОРА ПРОЛОГ-МАШИНЫ
- •Трассировка доказательства теоремы
- •4. ЯЗЫК ПРОЛОГ
- •4.1. Объявления
- •4.2. Данные и константы
- •Типы данных в Прологе
- •4.3. Управление возвратом
- •5. ВСТРОЕННЫЕ ПРЕДИКАТЫ И ФУНКЦИИ
- •5.1. Арифметические вычисления
- •5.2. Ввод и вывод
- •5.3. Текстовые окна и управление экраном
- •5.4. Обработка строк и преобразование типов
- •5.5. Базы данных
- •5.6. Вспомогательные средства
- •6. МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •ОСНОВНЫЕ КОНСТРУКЦИИ ЯЗЫКА ПРОЛОГ

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).