prolog中的谓词

prolog中的谓词,prolog,Prolog,我需要在prolog中定义一个谓词,它以一个列表作为输入,对数的平方进行求和>=5,然后减去数的绝对值之和如果保持它更简单,可能会更简单,可以使用累加器使它更简单。而且,如果你像这样把条件移开,打字可能会少一些 weird_sum(List, Sum) :- weird_sum(List, 0, Sum). weird_sum([], Acc, Sum) :- Sum is Acc. weird_sum([X|Xs], Sum0, Sum) :- once( weird_sum

我需要在prolog中定义一个谓词,它以一个列表作为输入,对数的平方进行求和>=5,然后减去数的绝对值之和如果保持它更简单,可能会更简单,可以使用累加器使它更简单。而且,如果你像这样把条件移开,打字可能会少一些

weird_sum(List, Sum) :-
    weird_sum(List, 0, Sum).

weird_sum([], Acc, Sum) :- Sum is Acc.
weird_sum([X|Xs], Sum0, Sum) :-
    once( weird_sum_helper(X, Sum0, Sum1) ),
    weird_sum(Xs, Sum1, Sum).

weird_sum_helper(X, Acc, Acc + X*X) :- X >= 5.
weird_sum_helper(X, Acc, Acc - abs(X)) :- X =< 2.
weird_sum_helper(X, Acc, Acc) :- X < 5, X > 2.
sum(列表,sum):-
奇怪的求和(列表,0,求和)。
奇怪的总和([],Acc,sum):-总和是Acc。
奇怪的求和([X | Xs],求和0,求和):-
一次(奇怪的求和助手(X,Sum0,Sum1)),
奇怪的求和(Xs,Sum1,sum)。
奇怪的求和助手(X,Acc,Acc+X*X):-X>=5。
奇怪的求和助手(X,Acc,Acc-abs(X)):-X=<2。
奇怪的求和助手(X,Acc,Acc):-X<5,X>2。
但是你的原始问题的实际答案在上面的最后一行,只要说当X小于5,X大于2时,你什么都不做

但我得到的答案和33不同,因为当数字是负数,你们减去它,你们得到的是正数,而不是负数,但我不确定这是否是你们的意思


我使用了
一次
一次,只是因为您只想这样做一次,因为这三个条件相互排斥,但不知怎的,Prolog不知道它应该只使用一个条件,并尝试其他条件。

添加一个“全部跳过”子句:

weird_sum([_|Tail], Result) :- weird_sum(Tail, Result).

我想当你分析这个子句应该添加到哪里时,你会对Prolog的工作有一些了解。

我不是很确定,但也许它应该是6*6-2-(-1)=35?它是33的原因是它需要所有东西的绝对值@johnkaton aha好吧,我想你只写abs(X)而不是X?我再次编辑了答案,所以现在有了这个答案我也得到了33。但是你的问题的答案仍然是
X<5,X>2
@johnkaton我不理解你的编辑。Prolog甚至没有“功能”,它可能有“预定”功能?如果你想叫它“foobar”但叫“func”?或者你的意思是它有一种奇怪的气味?是的。这就是我所说的函数。最初的名字很奇怪。我之所以使用函数这个词,是因为它是一个执行特定任务的代码体。不管怎样,我已经将它编辑成pred,这将使它更容易理解。@johnkaton至少你的一个同学或同事对同一个作业有问题:也许可以保留怪异的sum以便更容易找到?这很有效。谢谢我猜这是最后一个,因为输入与前两个案例不匹配。
Result= 33 (6*6 -2-1)
weird_sum(List, Sum) :-
    weird_sum(List, 0, Sum).

weird_sum([], Acc, Sum) :- Sum is Acc.
weird_sum([X|Xs], Sum0, Sum) :-
    once( weird_sum_helper(X, Sum0, Sum1) ),
    weird_sum(Xs, Sum1, Sum).

weird_sum_helper(X, Acc, Acc + X*X) :- X >= 5.
weird_sum_helper(X, Acc, Acc - abs(X)) :- X =< 2.
weird_sum_helper(X, Acc, Acc) :- X < 5, X > 2.
weird_sum([_|Tail], Result) :- weird_sum(Tail, Result).