自定义约束的结合



我定义了一些自定义约束,如下所示:

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).

相关内容

  • 没有找到相关文章

最新更新