да / нет возврат в запросе PROLOG

Я только изучаю PROLOG, и мне сложно понять, почему запросы, которые я выполняю, заканчиваются «да / нет». Вот моя КБ:

male(albert).
male(bob).
male(bill).
male(carl).
male(charlie).
male(dan).
male(edward).

female(alice).
female(betsy).
female(diana).

parent(albert, bob).
parent(albert, betsy).
parent(albert, bill).

parent(alice, bob).
parent(alice, betsy).
parent(alice, bill).

parent(bob, carl).
parent(bob, Charlie).

Затем я выполняю следующий запрос:

 ?-female(X).

который возвращает:

X = alice ? ; 
X = betsy ? ;
X = diana
yes

Когда я спрашиваю:

 ?-parent(X, bob).

Я вернулся:

 X = albert ?;
 X = alice ?;
 no

Почему один дает ответ «да», а другой - «нет»?


person Carmine Reddit    schedule 14.04.2018    source источник
comment
В Prolog есть предикаты, которые не являются функциями. Это означает, что когда вы вызываете один, это запрос, который будет успешным (возможно, несколько раз с более чем одним решением) или неудачным (без решений). В этом случае «да» означает успех, а «нет» - неудачу. Когда Prolog запрашивает ? после решения, это означает, что у него есть больше вариантов для изучения, которые могут или не могут быть успешными. Если вы нажмете ;, Prolog попытается выбрать вариант и, если он не найдет дополнительных решений, откажется. Если вы не получаете приглашение ?, это означает, что точки выбора не было, и Prolog просто отвечает «да».   -  person lurker    schedule 14.04.2018


Ответы (1)


От системы Пролога зависит, как верхний уровень показывает замену ответа. Особенно, может ли верхний уровень обнаружить детерминированный успех запроса. Последнее означает, что запрос выполнен успешно и не оставил некоторых точек выбора.

Например, GNU-Prolog, SWI-Prolog, Jekejeke Prolog могут обнаруживать детерминированный успех запроса и не спрашивают конечного пользователя, хочет ли он дальнейших замен ответов. Поскольку, когда нет точек выбора, будет только следующий ответ «нет».

При детерминированном обнаружении успеха запроса:

?- female(X).
X = alice ;
X = betsy ;
X = diana.

Без детерминированного обнаружения успеха запроса:

?- female(X).
X = alice ;
X = betsy ;
X = diana ;
no

На самом деле нет системы Prolog, которая показывала бы да, как в вашем сообщении, после последней точки с запятой. Это невозможно, и я считаю, что система Prolog сломана.

person Mostowski Collapse    schedule 04.11.2018
comment
«На самом деле не существует системы Prolog, которая показывала бы да, как в вашем сообщении, после последней точки с запятой». Эта система существует и называется «GNU Prolog». | ?- female(X). X = diana (1 ms) yes | ?- - person beroal; 25.10.2020