我定义了一些自定义约束,如下所示:
constraint(a,something).
constraint(a,something1).
constraint(a,something2).
因此,我需要它们之间的逻辑结合。(如果一个约束失败,结果应该失败)
result(X) :-
constraint(X,something),
constraint(X,something1),
constraint(X,somethingElse).
我正在寻找一种更方便的方法来避免所有约束的显式编码。
result(X) :- ????
考虑使用 maplist/2
:
all_true(X) :- maplist(constraint(X), [something, something1, something2]).
在某些时候,您需要在某个地方使用谓词来实际列出要应用的所有约束。你可以做这样的事情:
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).