您好我正在创建一个谓词列表,如果使用该列表,则会为您提供某个范围之间的数字。所以说例如
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”
答案 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)