1

我已经定义了一些这样的自定义约束:

constraint(a,something).
constraint(a,something1).
constraint(a,something2).

因此,我需要它们的这种逻辑结合。(如果一个约束失败,结果应该失败)

result(X) :-
    constraint(X,something),
    constraint(X,something1),
    constraint(X,somethingElse).

我正在寻找一种更方便的方法来避免对所有约束进行这种显式编码。

result(X) :- ????
4

2 回答 2

3

考虑使用maplist/2

all_true(X) :- maplist(constraint(X), [something, something1, something2]).
于 2014-01-03T15:52:52.430 回答
2

在某些时候,您需要一个谓词来实际列出您希望应用的所有约束。你可以这样做:

result(X) :-
    constraints(X, [something, something1, something2]).

constraints(X, [H|T]) :-
    constraint(X, H),
    constraints(X, T).
constraints(_, []).

如果需要,此机制允许您以列表的形式动态生成约束。您还可以让约束列表成为事实:

constraint_list(a, [something, something1, something2]).

然后在result谓词中使用它:

result(X) :-
    constraint_list(X, List),
    constraints(X, List).
于 2014-01-03T14:45:25.060 回答