【问题标题】:Prolog Code outputs False instead of Variable valueProlog 代码输出 False 而不是变量值
【发布时间】:2019-08-12 01:30:56
【问题描述】:

返回列表中偶数和的谓词:

sumsq_even([], 0).
sumsq_even([FirstNum|RestOfNums], Total) :-
    sumsq_even(RestOfNums, TotalRest),
    Total is FirstNum + TotalRest :- 0 is FirstNum mod 2,  % Add Firstnum if it is even
    Total is TotalRest :- 1 is FirstNum mod 2.             % Dont add if firstnum is odd

首先我的代码编译但我得到一个语法错误:第 4 行中的运算符优先级冲突。当我尝试查询时:

sumsq_even([1,3,5,2,-4,6,8,-7], Total).

它返回 False 而不是 Total 的值。我做错了什么?

【问题讨论】:

  • 序言?那么s 标签是怎么回事?请注意您选择的标签,因为如果您放置了错误的标签,正确的人可能会忽略您的问题。另外请花一些时间阅读how to ask good questionsthis question checklist。并注意标签下方的edit 链接,它可以让您编辑您的问题以改进它。请同时阅读the editing help
  • 对不起,我不小心把我的错字贴出来了。我现在已经编辑了帖子谢谢。
  • 我认为你不需要使用mod。我认为您可以使用“头/尾”[FirstNum|RestOfNums] 功能来丢弃所有其他项目
  • 抱歉,我之前的评论有误(已删除)。在序言中总结一个列表:stackoverflow.com/questions/9875760/…
  • 感谢您的回答,但我想我必须使用 mod。如果没有它,你将如何区分奇数或偶数,因为我只想要偶数的总和?

标签: list recursion prolog


【解决方案1】:

在您的代码(第 4 行和第 5 行)中使用 :- 不正确。在 Prolog 中,if A then B else C 写作( A -> B ; C)。所以你的代码应该是:

sum_even([],S,S).
sum_even([H|T],ST,S):-
    (   0 =:= H mod 2 ->  
        SO is ST+H;
        SO = ST
    ),
    sum_even(T,SO,S).

sumsq_even(L,Total):-
    sum_even(L,0,Total).

?- sumsq_even([1,3,5,2,-4,6,8,-7], Total).
Total = 12.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多