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

How to make the output of this prolog program state "true"?

我有这个示例 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.

我的任务是让程序给出"true"作为最终答案。如果我是正确的,它会给出 false,因为当它为最后一个元素 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 或回溯的概念,所以这可能是一个措辞不当的解释,我的解决方案背后的逻辑也很可能是错误的。为此我很抱歉。

感谢您的帮助!

您可以添加 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).