我有这个示例prolog程序,它在输出上打印一些*对应于列表元素的大小。
bl([N|L]):-s(N),nl,bl(L).
s(N):-N>0,write(*),N1 is N-1,s(N1).
s(N):-N=<0.
例如,对于查询bl([1,1,2,6,24]).
,程序输出:
1 ?- bl([1,1,2,6,24]).
*
*
**
******
************************
false.
我的任务是让程序给出&#34; true&#34;作为最终答案。如果我是正确的,它会给出错误,因为当它完成调用并打印*为最后一个元素24时,prolog会尝试匹配尾部bl([]),这现在是一个空列表并开始回溯。因此我尝试在nl
之后进行切割,但这也没有效果。任何想法为什么,或如何使其输出真实?
bl([N|L]):-s(N),nl,!,bl(L).
s(N):-N>0,write(*),N1 is N-1,s(N1).
s(N):-N=<0.
我不太了解prolog或回溯的概念,所以这可能是一个措辞错误的解释,我的解决方案背后的逻辑很可能也是错误的。为此,我很抱歉。
感谢您的帮助!
答案 0 :(得分:1)
你可以添加bl([]).
,或者使用maplist / 2并略微改变你的程序,因为bl / 1它实际上只是访问列表所需的服务谓词。
s(N):-N>0,write(*),N1 is N-1,s(N1).
s(N):-N=<0,nl.
bl(L) :- maplist(s, L).