Факты, правила и вопросы.
Переменные и имена
Переменная начинается с прописной буквы, тогда как имена предикатов, имена функций и имена объектов должны начинаться со строчной буквы.
Имена функций:
person child father
Переменные:
X Y Z
Символы
A, B /* A AND B */ A ; B /* A OR B */ not(A,B) /* not A AND B */ A :- B /* A if B */
Факты
Факт – это предикатное выражение, которое делает декларативное утверждение. Всякий раз, когда переменная встречается в выражении Пролога, предполагается, что она универсально определена количественно.
Обратите внимание, что все факты пролога заканчиваются точкой.
Он имеет форму:
name_of_statement1(X). name_of_statement2(X1,X2).
где name_of_statement — это имя декларатива.
Чтобы лучше понять, что подразумевает факт, мы можем рассмотреть ребенка в семье.
person(bob). /* bob is a person */ person(john). /* john is a person */ person(jacob). /* jacob is a person */ person(mike). /* mike is a person */ male(bob). /* bob is male */ male(john). /* john is male */ male(jacob). /* jacob is male */ male(mike). /* mike is male */ child(bob, john). /* bob is a child of john */ child(jacob, mike). /* jacob is a child of mike */ child(mike,bob). /* mike is a child of bob */
Правила
Правило – это выражение-предикат, в котором используется логическое значение (:-) для описания взаимосвязи между фактами.
Правило пролога имеет вид:
left_hand_side :- right_hand_side
Это можно интерпретировать как: левая_сторона, если правая_сторона. left_hand_side ограничен одним положительным литералом, что означает, что он должен состоять из положительного атомарного выражения. Оно не может быть отрицаемо и не может содержать логических связок.
Примеры:
father(A,B) :- male(A), child(B,A). /* A is a father of B if male and B is its child */ is_male(A) :- person(A), male(A). /* A is a person and is male */
Запросы
Запрос – это выражение, которое должно быть оценено интерпретатором Пролога. Чтобы интерпретатор Пролога мог ответить на запрос, программа должна быть загружена. После загрузки база данных правил и фактов формируется и затем может быть оценена интерпретатором. Когда делается запрос, он стремится быть доказанным. Если интерпретатор найдет ответ, он ответит «да» и перечислит все привязки переменных. Если он не сможет доказать, он ответит «нет».
Команда для загрузки программы на прологе:
['name_of_file'].
Чтобы проверить, загружена ли программа Prolog в среду, prolog ответит «да».
Предположим, у нас есть файл с именем test.pl.
person(bob). /* bob is a person */ person(john). /* john is a person */ person(jacob). /* jacob is a person */ person(mike). /* mike is a person */ male(bob). /* bob is male */ male(john). /* john is male */ male(jacob). /* jacob is male */ male(mike). /* mike is male */ child(bob, john). /* bob is a child of john */ child(jacob, mike). /* jacob is a child of mike */ child(mike,bob). /* mike is a child of bob */ father(A,B) :- male(A), child(B,A). is_male(A) :- person(A), male(A). /* A is a person and is male */
Загрузка программы:
| ?- ['test.pl']. compiling /Users/miguel/Dropbox/cs/ecs140/final/test.pl for byte code... /Users/miguel/Dropbox/cs/ecs140/final/test.pl compiled, 15 lines read - 1631 bytes written, 6 ms
Теперь, когда программа загружена, база данных будет заполнена данными фактами.
Затем мы можем выполнить следующие запросы:
| ?- father(A,B). A = bob B = mike ? ; A = john B = bob ? ; A = mike B = jacob ? ; no | ?- is_male(A). A = bob ? ; A = john ? ; A = jacob ? ; A = mike (1 ms) yes
Ссылка: