我已经定义了一些自定义约束:
constraint(a,something).
constraint(a,something1).
constraint(a,something2).
我需要它们的所有逻辑结合作为结果。 (如果一个约束失败,结果应该失败)
result(X) :-
constraint(X,something),
constraint(X,something1),
constraint(X,somethingElse).
我正在寻找一种更方便的方法来避免对所有约束进行显式编码。
result(X) :- ????
答案 0 :(得分:3)
考虑使用maplist/2
:
all_true(X) :- maplist(constraint(X), [something, something1, something2]).
答案 1 :(得分: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).