自定义约束的连接

时间:2014-01-03 14:32:50

标签: prolog declarative-programming

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

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

我需要它们的所有逻辑结合作为结果。 (如果一个约束失败,结果应该失败)

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

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

result(X) :- ????

2 个答案:

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