为什么 prolog 中的 length/2 谓词可以产生无限数量的长度?

Why length/2 predicate in prolog can produce infinite number of lengths?

提问人:John Sall 提问时间:11/9/2018 最后编辑:lurkerJohn Sall 更新时间:11/10/2018 访问量:231

问:

当我应用此查询时:

?长度(P, _)。

P = [] ? ;

P = [_] ? ;

P = [_,_] ? ;

P = [_,_,_] ? ;

P = [_,_,_,_] ?

我有这个结果。这是如何工作的?

序言

评论

2赞 coder 11/9/2018
因为由于您没有指定任何长度,Prolog 会尝试所有可能的长度并生成相应的列表,正如您所看到的,它从您得到的长度 0 开始,然后是您得到的长度 1,等等......P = []P = [_]
0赞 Guy Coder 11/9/2018
相关问题:跟踪时 Prolog 中的重做是什么?
1赞 Guy Coder 11/9/2018
感兴趣的:Prolog 中的列表长度
1赞 lurker 11/10/2018
Prolog 试图找到导致谓词成功的变量实例(注意:它是一个谓词,而不是一个函数)。当你查询时,你是在问Prolog什么实例会给我任何长度。Prolog 使用列表进行响应,列表首先长度为 0,然后是长度 1,依此类推。你没有限制长度(它是可变的),所以你得到了“无限”的数字结果。此外,由于您为 length 提供了一个匿名变量,因此它也不会为您提供 length 值的特定结果。将您的结果与结果进行比较,看看您得到了什么。length(P, _)PP_length(P, N).

答:

3赞 user502187 11/10/2018 #1

通过选择点。一旦谓词具有多个子句,就会大致创建一个选择点:

length([], 0).
length([_|L], M) :- length(L, N), M is N+1.

然后,Prolog 解释器会给出这些选择点的不同推导。以下是 Tau Prolog 沙盒中的派生屏幕截图:

enter image description here

等等,我想我需要提出一个问题,这个推导截图显示的有点太多了。合成 (=)/2 和对照 (,)/2。