使用原子的prolog总和列表

时间:2014-12-04 22:09:15

标签: prolog sum atomic flatten

我正在尝试在prolog中执行sumList函数 输入:sumList([1,[2,3],[4],5],X)。并返回X = 15.

我理解如何总结一个简单的列表和列表列表(即[1,2,3,4,5]& [[1,2,3],[4,5]])但我是得到错误,因为我没有正确地处理多个内部列表(因为我还不知道如何,我之前没有遇到过这个),我被告知我必须以某种方式使用原子或原子,但我还没有看到了如何做到这一点的明确例子。 我可以翻译的任何sml代码或prolog代码可以帮助我总结列表[1,[2,3],[4],5]将是非常有用的。 谢谢!

2 个答案:

答案 0 :(得分:0)

在SWI Prolog中(只是不确定ANSI),atomic(X)谓词可以告诉您X是列表还是数字(在您的情况下)。可以使用它在遇到列表时通过递归调用自身来编写sum谓词,或者只是将一个元素添加到一个总和中,如果是一个简单的数字:

sum([], 0).
sum([H|T], S) :-
    atomic(H),
    sum(T, S1),
    S is H + S1.
sum([H|T], S) :- 
    sum(H, S1),
    sum(T, S2),
    S is S1 + S2.

答案 1 :(得分:0)

Prolog 将 [] 视为原子。 Eugene Sh. 的实现不处理 H 是空列表 [] 的情况。在第二个子句中检查 H 是否为空列表可以解决问题。

sum([], 0).
sum([H|T], S) :-
    atomic(H),
    H\==[], % fail incase H is an empty list 
    sum(T, S1),
    S is H + S1.
sum([H|T], S) :- 
    sum(H, S1),
    sum(T, S2),
    S is S1 + S2.