【问题标题】:Prolog - arguments are not instantiatedProlog - 参数未实例化
【发布时间】: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

这是怎么回事?

【问题讨论】:

  • &lt;/2&gt;/2 运算符要求所有参数都具有特定值(已实例化)才能工作。因此,如果N 没有值(不是实例化),那么N &lt; 10 将生成该错误。如果您尝试生成具有某些约束的可能值,您可能希望使用 CLPFD 库,然后您可以使用 N #&lt; 10 等。
  • 你的意思是什么?
  • @mat:在对抗实际上并没有声称任何错误的实例化错误之前,先对抗产生错误答案的程序怎么样?
  • @false:在我看来,这个网站上这种类型的问题太多了,而且大多数问题都可以通过简单地使用更多的声明性谓词来解决。我想奖励传播更优雅方法的用户,通常会提供更正确的以及更通用的解决方案。 150 分是鼓励这一点的第一个赞赏标志。对于更重要的贡献,例如非常优雅的解决方案,我给 200 分甚至更多。
  • 显然已经证明了第三次的合理性。以这种方式发放赏金一点也不好玩。

标签: prolog clpfd


【解决方案1】:

基本上你正在编写一个检查全局含义的程序:

forall N, if N < 10 then N > 5

并且您想知道N 的哪个域拥有。

现在你在序言中正确地改写为:

\+ ( N < 10, \+ ( N > 5 ) ).

但是如果你尝试将该查询提供给 prolog 解释器,它将输出错误:

?- \+ ( N < 10, \+ ( N > 5 ) ).
ERROR: </2: Arguments are not sufficiently instantiated

因为&lt; 的参数没有被实例化。像N &lt; 3 这样的简单查询也会发生同样的事情。当然,如果你在查询之前实例化它,问题就消失了:

?- N=5, \+ ( N < 10, \+ ( N > 5 ) ).
false.

(对于 N=5,该语句不成立)

?- N=6, \+ ( N < 10, \+ ( N > 5 ) ).
N = 6.

(但它适用于 N=6)。

您还可以放置一个谓词,通过回溯为N 生成多个分配,以代替N=6

?- between(1, 12, N), \+ ( N < 10, \+ ( N > 5 ) ).
N = 6 ;
N = 7 ;
N = 8 ;
N = 9 ;
N = 10 ;
N = 11 ;
N = 12.

但是对于一个大型域,这将是非常低效的(它需要对域的每个元素进行回溯)。

如果您想推理有限域(即整数),您可以按照@lurker 的建议使用CLPFD 库。这种方法更有效,因为它具有推理区间、区间交集等的规则。

您必须将 &lt;&gt;,\+ 替换为 CLP 运算符 #&lt;#&gt;#/\#\。让我们试试吧:

?- use_module(library(clpfd)).
?- #\ ( N #< 10 #/\ #\ ( N #> 5 ) ).
N+1#=_G11193,
N#>=6#<==>_G11205,
10#>=_G11193#<==>_G11217,
_G11217 in 0..1,
_G11217#/\_G11244#<==>0,
_G11244 in 0..1,
#\_G11205#<==>_G11244,
_G11205 in 0..1.

这可能有点难以阅读,但除此之外,它告诉您您正在寻找的答案,即 N 的域:N #&gt;= 6

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多