【发布时间】:2015-03-18 19:06:29
【问题描述】:
我正在尝试了解 Prolog 的工作原理。我正在使用 SWI-Prolog。 下面是一段代码:
forall(C1,C2) :- \+ (C1, \+ C2).
foo(N) :- N < 10.
bar(N) :- N > 5.
foobar(N) :- forall(foo(N),bar(N)).
如果我执行以下操作,它会产生所需的输出:
?- foobar(5).
false.
但是当我尝试查看所有可能的值时,我得到一个错误:
?- foobar(N).
ERROR: </2: Arguments are not sufficiently instantiated
这是怎么回事?
【问题讨论】:
-
</2和>/2运算符要求所有参数都具有特定值(已实例化)才能工作。因此,如果N没有值(不是实例化),那么N < 10将生成该错误。如果您尝试生成具有某些约束的可能值,您可能希望使用 CLPFD 库,然后您可以使用N #< 10等。 -
你的意思是什么?
-
@mat:在对抗实际上并没有声称任何错误的实例化错误之前,先对抗产生错误答案的程序怎么样?
-
@false:在我看来,这个网站上这种类型的问题太多了,而且大多数问题都可以通过简单地使用更多的声明性谓词来解决。我想奖励传播更优雅方法的用户,通常会提供更正确的以及更通用的解决方案。 150 分是鼓励这一点的第一个赞赏标志。对于更重要的贡献,例如非常优雅的解决方案,我给 200 分甚至更多。
-
显然已经证明了第三次的合理性。以这种方式发放赏金一点也不好玩。