如何使这个prolog程序的输出状态" true"?

时间:2015-11-19 11:37:25

标签: list prolog backtracking

我有这个示例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或回溯的概念,所以这可能是一个措辞错误的解释,我的解决方案背后的逻辑很可能也是错误的。为此,我很抱歉。

感谢您的帮助!

1 个答案:

答案 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).