2017-03-28 163 views
2

我需要在prolog中定義一個謂詞,它將一個列表作爲輸入並將數字的平方和> = 5並減去數字的絕對值之和< = 2。prolog中的謂詞

這是我目前: -

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) 
+1

我不是很確定,但也許應該是6 * 6 - 2 - (-1)= 35? –

回答

0

添加「跳過所有」條款:

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

我想你會獲得一些洞察到Prolog的,當你分析哪裏這一條款應補充工作。

+0

這個工程。謝謝。我想最後這是因爲輸入與前兩種情況不匹配。 –

0

也許是簡單的,如果你把它更簡單,你可以使用蓄電池,使其更簡單。而且,如果你將條件式移出,也可以少打字,就像這樣;

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不知道它應該只採取一個,並嘗試其他人。

+0

它是33的原因是它取所有東西的絕對值<= 2。忘了提到這一點。抱歉。 –

+0

@JohnKeaton aha好吧你只是寫abs(X)而不是X我猜?我再次編輯答案,所以現在這個答案我也得到了33。但你的問題的答案仍然是'X < 5, X > 2'。 –

+1

@JohnKeaton我不明白你的編輯。 Prolog甚至沒有「功能,它有」預測「,也許?如果你想要叫「foobar」而不是「func」?或者你的意思是它有一種奇怪的味道? –