2015-06-11 3 views
2

У меня проблема с фактами. Допустим, у меня есть 3 факта и вопрос check(X).Prolog- Возвращающиеся элементы из фактов

fact(a,b). 
fact(b,c). 
fact(a,d). 

check(X):- 
//some calculation with fact() 

Как сделать вышеупомянутый вопрос, чтобы вернуть список элементов для данного X от всех фактов? Например: check(a) даст результат b и d. Поэтому я могу использовать этот const позже. check(b) вернется c. Я был бы благодарен за помощь!

ответ

1

Вам нужен дополнительный аргумент для списка. Поэтому вы не можете назвать это check/1, имея один аргумент, но — скажем — related_to/2.

related_to(X, Ys) :- 
    setof(Y, fact(X, Y), Ys). 

Примеры запросов:

?- related_to(a, Xs). 
Xs = [b, d]. 

?- related_to(b, Xs). 
Xs = [c]. 

?- related_to(d, Xs). 
false. 

?- related_to(X, Xs). 
X = a, 
Xs = [b, d] ; 
X = b, 
Xs = [c]. 

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

Также обратите внимание, что это соотношение не является монотонным: если вы добавите дополнительные факты, ранее полученные результаты больше не сохраняются. К слову, добавляя fact(a,f), гол related_to(a, [b,d]) больше не выполняется. Вместо этого теперь выполняется related_to(a,[b,d,f]).