Факты, правила и вопросы.

Переменные и имена

Переменная начинается с прописной буквы, тогда как имена предикатов, имена функций и имена объектов должны начинаться со строчной буквы.

Имена функций:

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

Ссылка: