Пролог - могу ли я найти все случаи, которые сделали бы предикат истинным? - PullRequest
0 голосов
/ 08 сентября 2018

Если у меня есть два таких правила:

hasproperty(X, wet) :- hasproperty(X, was_in_rain).
hasproperty(X, wet) :- hasproperty(X, washed).

Как я могу спросить - какими свойствами мог бы обладать Х, чтобы он был мокрым? В примере я хочу получить: was_in_rain и wash.

12 сентября, уточнение: я не заинтересован в нахождении всех X, которые имеют свойство быть мокрым. Представьте себе, что никаких дальнейших правил или фактов не определено. Что меня интересует: дайте мне возможный Y в hasproperty (X, Y), из которого через правила пролога вы можете вывести hasproperty (X, wet). Результатом в данном примере будет Y = was_in_rain и Y = wash

По сути, мне интересно, возможно ли иметь запросы, которые бы анализировали сами правила.

1 Ответ

0 голосов
/ 10 сентября 2018

Вы можете использовать findall / 3 , чтобы найти все решения предиката. В этом случае оказывается, что hasproperty(X, wet) всегда ложно.

:- initialization(main).

main :-
    findall(X,hasproperty(X,wet),Z),
    writeln(Z). % there are no solutions, so Z is an empty list

hasproperty(X, wet) :- hasproperty(X, was_in_rain).
hasproperty(X, wet) :- hasproperty(X, washed).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...