当按下半冒号时,prolog列表会不断扩展

时间:2016-05-10 12:26:14

标签: prolog

您好我正在创建一个谓词列表,如果使用该列表,则会为您提供某个范围之间的数字。所以说例如

list_from(1,5,X).

会给你

X=[1,2,3,4,5].

但是我让我的谓词工作,但是这个列表一直在不断扩展,所以它不断增加我的谓词,我不希望它。这就是正在发生的事情。

?- list_from(1,7,X).
X = [1, 2, 3, 4, 5, 6, 7] ;
X = [1, 2, 3, 4, 5, 6, 7, 8] ;
X = [1, 2, 3, 4, 5, 6, 7, 8, 9] ;
X = [1, 2, 3, 4, 5, 6, 7, 8, 9|...] ;
X = [1, 2, 3, 4, 5, 6, 7, 8, 9|...] 

如何让它停止?

这是我的代码

list_from(M,N,[]):- M > N.
list_from(M,N,[M|T]):- Mplusone is M + 1, list_from(Mplusone,N,T).

如果我删除Mplusone而不是M,我会收到错误“Out of global stack”

2 个答案:

答案 0 :(得分:3)

你的两个条款并不相互排斥。你在第一个条款中有一个“后卫”说M > N,但你在第二个条款中没有相反的条件,M =< N。如果您追踪执行情况,您应该了解当前定义会发生什么。

您也可以尝试查看SWI-Prolog library(lists)中的definition of numlist/3。它需要一种不同的方法:首先,确保参数有意义;然后,在初始Low确实低于High(并且两者都是整数)的条件下,生成一个列表。

答案 1 :(得分:2)

分号意味着您希望Prolog向您显示更多选项(您对答案不满意)。一个句号'。'将阻止Prolog为您提供替代方案。

你也可以使用一次/ 1来调用list_from / 3。 (感谢@mat)