Prolog Language учебник
Начало работы с языком Prolog
Поиск…
замечания
Реализации
- SWI-Prolog (бесплатно) swi-proog
- Реализовано в c
- SICStus (коммерческий) сикст-пролог
- YAP (бесплатно) yap
- GNU Prolog (бесплатно) gnu-prolog
- XSB (бесплатно) xsb
- B (коммерческий) b-пролог
- IF (коммерческий)
- Ciao (бесплатно)
- Минерва (коммерческая)
- ECLiPSe-CLP (бесплатно) eclipse-clp
- Jekejeke Prolog (коммерческий)
- Пролог IV
- Выход Пролог (бесплатно)
- Реализовано в c # , javascript и phyton
- Визуальный пролог (коммерческий) визуально-пролог
Установка или настройка
SWI-Prolog
Windows и Mac:
- Скачать SWI-Prolog на официальном сайте
- Просто установите, следуя инструкциям установщика.
Linux (PPA):
Добавьте PPA
ppa:swi-prolog/stable
к источникам программного обеспечения вашей системы (разработчики могут выбрать дляppa:swi-prolog/devel
):Откройте терминал (Ctrl + Alt + T) и введите:
sudo add-apt-repository ppa:swi-prolog/stable
Затем обновите информацию о пакете:
sudo apt-get update
Теперь установите SWI-Prolog через диспетчер пакетов:
sudo apt-get install swi-prolog
Теперь вы можете запустить SWI-Prolog через командную строку с командой
swipl
добавление / 3
append([], Bs, Bs).
append([A|As], Bs, [A|Cs]) :-
append(As, Bs, Cs).
append/3
является одним из самых известных отношений Prolog. Он определяет связь между тремя аргументами и является истинным, если третий аргумент представляет собой список, который обозначает объединение списков, указанных в первом и втором аргументах.
Примечательно, что, как и для хорошего кода Prolog, append/3
можно использовать в нескольких направлениях : его можно использовать для:
добавьте два полностью или частично созданных списка:
?- A = [1, 2, 3], B=[4, 5, 6], append(A, B, Y) Output: A = [1, 2, 3], B = [4, 5, 6], Y = [1, 2, 3, 4, 5, 6].
проверьте , верно ли отношение для трех полностью созданных списков:
?- A = [1, 2, 3], B = [4, 5], C = [1, 2, 3, 4, 5, 6], append(A, B, C) Output: false
создать все возможные способы добавления двух списков в данный список:
?- append(A, B, [1, 2, 3, 4]). Output: A = [], B = [1, 2, 3, 4] ; A = [1], B = [2, 3, 4] ; A = [1, 2], B = [3, 4] ; A = [1, 2, 3], B = [4] ; A = [1, 2, 3, 4], B = [] ; false.
Ограничения CLP (FD)
Ограничения CLP (FD) предоставляются всеми серьезными реализациями Prolog. Они позволяют нам рассуждать о целых числах чистым способом.
?- X #= 1 + 2.
X = 3.
?- 5 #= Y + 2.
Y = 3.
Программирование баз данных
Пролог классифицирует все на:
- Атомы - любая последовательность символов, которые не начинаются с прописного алфавита. Например -
a
,b
,okay
- Числа - для чисел нет специального синтаксиса, объявление не требуется. Например,
1
,22
,35.8
- Переменные - строка, начинающаяся с символа верхнего регистра или подчеркивания (
_
). Например,X
,Y
,Abc
,AA
- Сложные термины - они сделаны из функтора и последовательности аргументов . Имя комплексного члена всегда является атомом, а аргументы могут быть либо атомами, либо переменными. Например,
father(john,doe)
,relative(a)
,mother(X,Y)
.
Логическая база данных содержит набор фактов и правил .
Сложный член с атомами в качестве аргументов называется фактом, а сложный член с переменными в качестве аргументов называется правилом.
Пример фактов в Прологе:
father_child(fred, susan).
mother_child(hillary, joe).
Пример правила в Prolog:
child_of(X,Y):-
father_child(Y,X)
;
mother_child(Y,X).
Обратите внимание, что ;
здесь как оператор or
на других языках.
Prolog - это декларативный язык, и вы можете прочитать эту базу данных следующим образом:
Фред - отец сусан
холм - мать Джо.
Для всех
X
иY
X
является дочерним элементомY
еслиY
является отцомX
илиY
является материX
Фактически, конечный набор фактов и / или правил представляет собой логическую программу .
Использование такой программы демонстрируется путем выполнения запросов . Запросы позволяют извлекать информацию из логической программы.
Чтобы загрузить базу данных в интерпретатор (если вы сохранили базу данных в каталоге, в котором запущен интерпретатор), вы просто вводите:
?- [nameofdatabase].
заменив имя nameofdatabase
на фактическое имя файла (обратите внимание, что здесь мы исключаем расширение .pl
в имя файла).
Пример запросов в интерпретаторе для программы выше и результатов:
?- child_of(susan,fred).
true
?- child_of(joe,hillary).
true
?- child_of(fred,susan).
false
?- child_of(susan,hillary).
false
?- child_of(susan,X).
X = fred
?- child_of(X,Y).
X = susan,
Y = fred ;
X = joe,
Y = hillary.
Запросы выше и их ответы можно прочитать следующим образом:
является ли судан ребенком Фреда? - правда
является ли ребенок из холма? - правда
является ли ребенок сусан? - ложный
Сьюзан - ребенок холма? - ложный
кто является сусан ребенком? - fred
Вот как мы программируем логику в Prolog. Логическая программа более формально: набор аксиом или правил, определяющих отношения (ака предикаты) между объектами. Альтернативный способ интерпретации базы данных выше более формальным логическим способом:
Отношение
father_child
держится между fred и susan
Отношение
mother_child
относится к холмику и Джо
Для всех
X
иY
отношениеchild_of
выполняется междуX
иY
если отношениеfather_child
выполняется междуY
иX
, или отношениеmother_child
выполняется междуY
иX
Привет, мир
Привет, Мир в интерактивном интерпретаторе
Чтобы напечатать «Привет, мир!» в интерпретаторе Prolog (здесь мы используем swipl
, оболочку для SWI Prolog):
$ swipl
<...banner...>
?- write('Hello, World!'), nl.
?-
это системное приглашение: оно указывает, что система готова для пользователя ввести последовательность целей (т.е. запрос ), которые должны быть прерваны с помощью .
(полная остановка).
Здесь запрос write('Hello World!'), nl
имеет два цели:
-
write('Hello World!')
:'Hello World!'
должен отображаться и (,
) - должна следовать новая строка (
nl
).
write/1
(символ /1
используется, чтобы указать, что предикат принимает один аргумент), а nl/0
- встроенные предикаты (определение предоставляется заранее системой Prolog). Встроенные предикаты предоставляют средства, которые не могут быть получены с помощью чистого определения Prolog или для сохранения программиста от необходимости определять их.
Выход:
Привет, мир!
да
заканчивается на yes
что означает, что запрос преуспел. В некоторых системах вместо « yes
печатается true
.
Привет, Мир из файла
Откройте новый файл hello_world.pl
и вставьте следующий текст:
:- initialization hello_world, halt.
hello_world :-
write('Hello, World!'), nl.
Директива initialization
указывает, что цель hello_world, halt
следует вызывать, когда файл загружен. halt
завершает работу программы.
Затем этот файл можно выполнить с помощью исполняемого файла Prolog. Точные флаги зависят от системы Prolog. Если вы используете SWI Prolog:
$ swipl -q -l hello_world.pl
Это даст результат Hello, World!
, Флаг -q
подавляет баннер, который обычно отображается, когда вы вызываете run swipl
. Параметр -l
указывает файл для загрузки.