gpt4 book ai didi

list - Prolog:变量列表的头部未实例化

转载 作者:行者123 更新时间:2023-12-05 00:51:04 25 4
gpt4 key购买 nike

我正在编写一个简单的代码,生成一个包含 5 个数字的简单列表,其第一个变量应该是正数,我试图理解为什么这段代码失败

test([H|T]) :- H > 0, length(T,4).

当我调用
 length(X,5), test(X).

它向我显示以下错误:

ERROR: Arguments are not sufficiently instantiated



当我调试代码时, H test 中的变量未实例化。

有谁知道为什么?

最佳答案

这里的问题是您对 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] ;
...

关于list - Prolog:变量列表的头部未实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44807448/

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