2014-12-07 47 views
0

我必须编写一个谓词,它将列表中的所有项目相加。这些项目可以是列表中的列表。例如, sum1([1,[2,3],4,[5]],X)。 我有一些代码,应该工作,但是给一个参数没有充分实例化的错误。我对prolog非常陌生,但这些对我来说看起来很好。这里是我这个谓词(功能)全码序言总和所有投掷错误

suml([],0). 
suml([H|T],X) :- atomic(H),S2 is H + X, suml(T,S2). 
suml([H|T],X) :- suml(H,S1), S3 is S1 + X, suml(T,S3). 

回答

0

更改以下两个条件的顺序:S2 is H + X, suml(T,S2)和改变你使用is/2的方式。虽然这是逻辑编程,但规则中条件的顺序很重要。先将sum1(T, S2)放在第一位,因为在计算总和之前需要实例化S2。其次,is算术评估正确的部分,并与左边的部分相结合。所以,你真的想总结S2H得到X

suml([H|T],X) :- atomic(H), suml(T,S2), X is H + S2. 
+0

再次感谢您!我试过这第二行,但它不工作 suml([H | T],X):suml(T,X),suml(H,S1),S1 + X.基本上这就是说如果我有一个列表,总结这一点,并添加它。但这是行不通的,我即将开始undefined程序 – 2014-12-08 00:31:43

+0

nvm!我错了,因为教师的例子,我被X中的代码弄糊涂了......我现在明白了,它应该是suml([H | T],X): - suml(T ,S1),sum1(H,S2),X是S1 + S2。 – 2014-12-08 00:34:37