gpt4 book ai didi

prolog - Prolog 程序出现错误 : >/2: Arguments are not sufficiently instantiated

转载 作者:行者123 更新时间:2023-12-01 23:15:36 27 4
gpt4 key购买 nike

我创建了一个程序,list(X,Y)检查列表 Y 中的所有元素是否都小于 X。

代码如下。

list(X,[]).
list(X,[Y|Z]):-X>Y,list(X,Z).

当我输入 list(3,[1,2]) 时它工作正常.但是,如果我输入 list(3,Y ) 为了找到只包含小于 3 的元素的列表,会出错。

?- list(3,[1,2]).
true .

?- list(3,Y).
Y = [] ;
ERROR: >/2: Arguments are not sufficiently instantiated

我看了一些帖子也有同样的错误,但我还是不明白我的代码是哪一部分出错了。

这里有一个从网上找到的类似例子。 greater(X,Y,Z)返回部分 ZY大于 X .

greater(X,[],[]).
greater(X,[H|Y],[H|Z]) :- H>X, greater(X,Y,Z).
greater(X,[H|Y],Z) :- H=<X, greater(X,Y,Z).


?- greater(2,[1,2,3], Y).
Y = [3].

问题是,greater(X,Y,Z)的代码有什么区别?和 list(X,Y)这样调用greater(2,[1,2,3], Y).时就不会报错了.

感谢您提供的任何帮助。

最佳答案

因为 - 从您的评论来看 - 您似乎是在对整数进行推理:这是使用有限域约束的教科书示例,它在几乎所有现代 Prolog 实现中都可用,并且概括了整数算法,以便您可以在所有方向上使用它.

如果您只使用有限域约束 (#>)/2 而不是低级算术原语 (>)/2:

:- use_module(library(clpfd)).

list(X, []).
list(X, [Y|Z]):- X#>Y, list(X,Z).

约束允许您使用这个谓词,您也可以在所有方向上使用 maplist/2 来表示,如下面的查询:

?- maplist(#>(3), [1,2]).
true.

?- maplist(#>(X), [1,2]).
X in 3..sup.

?- maplist(#>(3), [A,B]).
A in inf..2,
B in inf..2.

?- maplist(#>(X), [Y,Z]).
Z#=<X+ -1,
Y#=<X+ -1.

即使是最一般的查询,其中没有实例化任何参数,也能给出有用的答案:

?- maplist(#>(X), Ls).
Ls = [] ;
Ls = [_G1022],
_G1022#=<X+ -1 ;
Ls = [_G1187, _G1190],
_G1190#=<X+ -1,
_G1187#=<X+ -1 ;
etc.

编辑:此外,您现在添加的示例可以通过有限域约束变得更加通用:

:- use_module(library(clpfd)).

greater(_, [], []).
greater(X, [H|Y], [H|Z]) :- H #> X, greater(X, Y, Z).
greater(X, [H|Y], Z) :- H #=< X, greater(X, Y, Z).

您现在可以在各个方向使用它,例如:

?- greater(X, [E], Ls).
Ls = [E],
X#=<E+ -1 ;
Ls = [],
X#>=E.

这对于原始版本是不可能的,其作者可能没有意识到限制。

关于prolog - Prolog 程序出现错误 : >/2: Arguments are not sufficiently instantiated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20070594/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com