Prolog:变量列表的头部未实例化
Prolog: Head of a variable list is not instantated
我正在编写一个简单的代码来生成一个包含 5 个数字的简单列表,其第一个变量应该是正数,我试图理解为什么这段代码会失败
test([H|T]) :- H > 0, length(T,4).
当我用
打电话时
length(X,5), test(X).
它向我显示以下错误:
ERROR: Arguments are not sufficiently instantiated
当我调试代码时,test
中的 H
变量没有被实例化。
有人知道为什么吗?
这里的问题是您的 test([H|T])
规则没有在 Prolog 中描述 H
是一个正整数。它只测试是否 H > 0
,因为 H
没有实例化而失败。只是试图将一个未实例化的变量与一个数字(H > 0
在这种情况下)进行比较不会导致 Prolog 假设您希望 H
成为一个数字,而且不会实例化 H
.
此外,您对 test/1
的规则并未描述列表的其余部分 (T
),只是强制其长度为 4。由于您查询的规则是原列表长度为5,此规定多余
您似乎想要定义 test(L)
,这意味着 L
是任意正整数列表。这通常使用 CLP(FD) 完成:
:- use_module(library(clpfd)).
test(X) :- X ins 1..10000.
此规则表示 X
是一个列表,其值在 1 到 10000 范围内。生成长度为 5 的列表的适当查询将是:
?- length(X, 5), test(X), label(X).
X = [1, 1, 1, 1, 1] ;
X = [1, 1, 1, 1, 2] ;
X = [1, 1, 1, 1, 3] ;
X = [1, 1, 1, 1, 4] ;
X = [1, 1, 1, 1, 5] ;
...
如果想进一步限制,说元素需要唯一,可以使用all_different/1
:
test(X) :- X ins 1..10000, all_different(X).
?- length(X, 5), test(X), label(X).
X = [1, 2, 3, 4, 5] ;
X = [1, 2, 3, 4, 6] ;
X = [1, 2, 3, 4, 7] ;
X = [1, 2, 3, 4, 8] ;
X = [1, 2, 3, 4, 9] ;
X = [1, 2, 3, 4, 10] ;
...
我正在编写一个简单的代码来生成一个包含 5 个数字的简单列表,其第一个变量应该是正数,我试图理解为什么这段代码会失败
test([H|T]) :- H > 0, length(T,4).
当我用
打电话时 length(X,5), test(X).
它向我显示以下错误:
ERROR: Arguments are not sufficiently instantiated
当我调试代码时,test
中的 H
变量没有被实例化。
有人知道为什么吗?
这里的问题是您的 test([H|T])
规则没有在 Prolog 中描述 H
是一个正整数。它只测试是否 H > 0
,因为 H
没有实例化而失败。只是试图将一个未实例化的变量与一个数字(H > 0
在这种情况下)进行比较不会导致 Prolog 假设您希望 H
成为一个数字,而且不会实例化 H
.
此外,您对 test/1
的规则并未描述列表的其余部分 (T
),只是强制其长度为 4。由于您查询的规则是原列表长度为5,此规定多余
您似乎想要定义 test(L)
,这意味着 L
是任意正整数列表。这通常使用 CLP(FD) 完成:
:- use_module(library(clpfd)).
test(X) :- X ins 1..10000.
此规则表示 X
是一个列表,其值在 1 到 10000 范围内。生成长度为 5 的列表的适当查询将是:
?- length(X, 5), test(X), label(X).
X = [1, 1, 1, 1, 1] ;
X = [1, 1, 1, 1, 2] ;
X = [1, 1, 1, 1, 3] ;
X = [1, 1, 1, 1, 4] ;
X = [1, 1, 1, 1, 5] ;
...
如果想进一步限制,说元素需要唯一,可以使用all_different/1
:
test(X) :- X ins 1..10000, all_different(X).
?- length(X, 5), test(X), label(X).
X = [1, 2, 3, 4, 5] ;
X = [1, 2, 3, 4, 6] ;
X = [1, 2, 3, 4, 7] ;
X = [1, 2, 3, 4, 8] ;
X = [1, 2, 3, 4, 9] ;
X = [1, 2, 3, 4, 10] ;
...