【问题标题】:Conjuction of custom constraints自定义约束的结合
【发布时间】:2014-01-03 14:32:49
【问题描述】:

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

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

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

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

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

result(X) :- ????

【问题讨论】:

  • prolog 中的谓词必须以小写字母开头。而正确的if 运算符是:- 而不是:=

标签: prolog declarative-programming


【解决方案1】:

考虑使用maplist/2

all_true(X) :- maplist(constraint(X), [something, something1, something2]).

【讨论】:

  • 不错,垫子 (+1)。自我注意:停止重写maplist。 ;)
【解决方案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).

【讨论】:

    猜你喜欢
    • 2016-12-05
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2014-09-19
    • 1970-01-01
    • 2017-04-25
    • 2019-11-02
    相关资源
    最近更新 更多