【发布时间】:2012-11-22 14:48:20
【问题描述】:
查看以下目标(我正在使用 swi-prolog 和 Markus Triska 的 clpfd):
result(Input,Result) :-
Input #> 10,
Result=decline.
result(Input,Result) :-
Input in 0..20,
Result=offer.
可能的查询如下所示:
?- result(15,B).
B = decline ;
B = offer.
我想添加一个订单或某种解决方案优先级。
如果“拒绝”是对Input=15 的有效响应,则不应再考虑第二个目标,因此只有B=decline 是解决方案,而不是B=offer。
我知道我可以添加!/0,但反过来就不行了。给我这个谓词的所有可能答案。
考虑到这个例子,Result=offer 应该只对 Input 0..10 成立,否则应该触发更高的先前下降目标。
当我尝试考虑谓词中的顺序时,我是否认为过于迫切?
【问题讨论】:
-
我也知道我当然可以更改 Input 变量的约束,但这不应该是解决方案。
-
谓词的子句中有 顺序。我认为改变 Input 变量的约束是这里的解决方案。
-
是的,你的想法很程序化,但这本身就是一个问题。为什么要使用 CLP/FD?按照您的设置方式,它看起来不像是一个约束和生成程序,只是一个普通的生成和测试程序。
-
此外,您的要求似乎是矛盾的:“如果“拒绝”是对
Input=15的有效响应,则不应再考虑第二个目标”意味着“所有可能的答案”应该只是 @ 987654330@,对吧? -
嗯,不完全是,应该如下:
Result=declineifInput in 11..supandResult=offerifInput in 0..10