谓语中的谓词

时间:2017-03-28 13:08:40

标签: prolog

我需要在prolog中定义一个谓词,它以列表作为输入,并将数字的平方与> = 5相加,并减去数字的绝对值之和< = 2。

这就是我目前的情况: -

pred([], 0).
pred([Head|Tail], Result) :-
    gr85(Head),
    pred(Tail, Total),
    Result is Head*Head + Total.

pred([Head|Tail], Result) :-
    leq2(Head),
    pred(Tail, Total),
    Result is Total - Head.

gr85(Number):-
    Number >= 5.

leq2(Number):-
    Number =< 2.

我的问题是如何排除2到5之间的任何内容。如果我在列表中输入3,则返回false。

预期输入

pred([3,6,2,-1], Result).

预期输出

Result= 33 (6*6 -2-1)

2 个答案:

答案 0 :(得分:0)

如果你更简单,也许它更简单,你可以使用累加器使其更简单。如果你像这样移动condiditional,它也可能更少打字;

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.

但是你原来问题的实际答案在上面的最后一行,只是说当X小于5且X大于2时你不做任何事情。

但是我从33得到了不同的答案,因为当数字是负数而你减去时你得到的是积极而不是负数但我不确定这是不是你的意思。

我曾经只使用once一次,因为你只想做一次,因为这三个条件相互排斥,但Prolog不知道它应该只拿一个并尝试其他条件。 / p>

答案 1 :(得分:0)

添加'全部跳过'子句:

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

我认为当你分析应该添加这个子句时,你会对Prolog的工作有所了解。