Как использовать и внутри мета-предиката findall/3
Я хотел бы написать это:
paths( Result ) :-
findall( B, f(B) , Result ).
f( B ) :-
f1( B ),
f2( B ).
только в одной строке. Так что в основном что-то вроде:
paths( Result ) :-
findall( B, f1(B) AND f2(B), Result ).
Я не знаю, как выразить "И" в постановке цели. Это вообще возможно?
1 ответ
Решение
Просто поставьте вокруг него скобки:
paths(Result) :-
findall(B, (f1(B),f2(B)), Result).
Дополнение: Цели - это просто соединения (и дизъюнкции) подцелей. Вы можете построить их в какой-то момент, а затем передать их, пока они не будут вызваны. Это полезно, если цель должна быть построена динамически:
Goal = (f1(X), (f2(X) ; f3(X))),
findall(X, Goal, Result),