Как использовать и внутри мета-предиката findall / 3 - PullRequest
3 голосов
/ 17 января 2012

Я хотел бы написать это:

paths( Result ) :-
    findall( B, f(B) , Result ).

f( B ) :-
    f1( B ),
    f2( B ).

в одну строку.В общем, что-то вроде:

paths( Result ) :-
    findall( B, f1(B) AND f2(B), Result ).

Я не знаю, как выразить «И» в формулировке цели.Возможно ли это вообще?

1 Ответ

7 голосов
/ 17 января 2012

Просто поставьте круглые скобки:

paths(Result) :-
    findall(B, (f1(B),f2(B)), Result).

Дополнение: Цели - это просто соединения (и дизъюнкции) подцелей. Вы можете построить их в какой-то момент, а затем передать их, пока они не будут вызваны. Это полезно, если цель должна быть построена динамически:

Goal = (f1(X), (f2(X) ; f3(X))),
findall(X, Goal, Result),
...