【问题标题】:Prolog sum all throwing errorProlog总和所有抛出错误
【发布时间】:2014-12-08 08:25:56
【问题描述】:

我必须编写一个谓词来汇总列表中的所有项目。这些项目可以是一个列表,其中包含列表列表。例如, sum1([1,[2,3],4,[5]],X)。 我有一些应该可以工作的代码,但是给出的参数没有充分实例化错误。我对序言很陌生,但这些对我来说还不错。这是我这个谓词(函数)的完整代码

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

【问题讨论】:

    标签: recursion prolog sum


    【解决方案1】:

    更改以下两个条件的顺序: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.
    

    【讨论】:

    • 再次感谢您!我尝试了第二行,但它不起作用 suml([H|T],X) :- suml(T,X),suml(H,S1), S1 + X。基本上这是说如果我有一个列表,也将其相加并添加。但这不起作用,我开始未定义的过程
    • 非虚拟机!我错了,我对自己代码中的 X 感到困惑,因为讲师如何提供示例.....我现在明白了,应该是 suml([H|T],X) :- suml(T ,S1),suml(H,S2), X 是 S1 + S2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多