我知道序言沒有返回值,但我需要更新一些變量的值,並用該程序獲得它在控制檯:序言「如何返回值」
max(A,B,C) :- (A>B -> C is A ; C is B).
maxAltura([],RES).
maxAltura([c(X,Y)|[]],RES) :- max(RES,Y, SUM).
maxAltura([c(X,Y)|R1],RES) :- RES>Y, maxAltura(R1,RES).
maxAltura([c(X,Y)|R1],RES) :- RES<Y, maxAltura(R1,Y).
maxAltura([c(X,Y)|R1],RES) :- RES=:=Y, maxAltura(R1,Y).
它只是需要一個列表的元組,並給出了這些tupes的第二個元素的最大值。
這是我的輸出
maxAltura([c(1,8),c(5,0),c(6,4),c(10,0),c(11,10),c(12,0)],0).
Call: (7) maxAltura([c(1, 8), c(5, 0), c(6, 4), c(10, 0), c(11, 10), c(12, 0)], 0) ? creep
Call: (8) 0>8 ? creep
Fail: (8) 0>8 ? creep
Redo: (7) maxAltura([c(1, 8), c(5, 0), c(6, 4), c(10, 0), c(11, 10), c(12, 0)], 0) ? creep
Call: (8) 0<8 ? creep
Exit: (8) 0<8 ? creep
Call: (8) maxAltura([c(5, 0), c(6, 4), c(10, 0), c(11, 10), c(12, 0)], 8) ? creep
Call: (9) 8>0 ? creep
Exit: (9) 8>0 ? creep
Call: (9) maxAltura([c(6, 4), c(10, 0), c(11, 10), c(12, 0)], 8) ? creep
Call: (10) 8>4 ? creep
Exit: (10) 8>4 ? creep
Call: (10) maxAltura([c(10, 0), c(11, 10), c(12, 0)], 8) ? creep
Call: (11) 8>0 ? creep
Exit: (11) 8>0 ? creep
Call: (11) maxAltura([c(11, 10), c(12, 0)], 8) ? creep
Call: (12) 8>10 ? creep
Fail: (12) 8>10 ? creep
Redo: (11) maxAltura([c(11, 10), c(12, 0)], 8) ? creep
Call: (12) 8<10 ? creep
Exit: (12) 8<10 ? creep
Call: (12) maxAltura([c(12, 0)], 10) ? creep
Call: (13) max(10, 0, _G4361) ? creep
Call: (14) 10>0 ? creep
Exit: (14) 10>0 ? creep
Call: (14) _G4359 is 10 ? creep
Exit: (14) 10 is 10 ? creep
Exit: (13) max(10, 0, 10) ? creep
Exit: (12) maxAltura([c(12, 0)], 10) ? creep
Exit: (11) maxAltura([c(11, 10), c(12, 0)], 8) ? creep
Exit: (10) maxAltura([c(10, 0), c(11, 10), c(12, 0)], 8) ? creep
Exit: (9) maxAltura([c(6, 4), c(10, 0), c(11, 10), c(12, 0)], 8) ? creep
Exit: (8) maxAltura([c(5, 0), c(6, 4), c(10, 0), c(11, 10), c(12, 0)], 8) ? creep
Exit: (7) maxAltura([c(1, 8), c(5, 0), c(6, 4), c(10, 0), c(11, 10), c(12, 0)], 0) ? creep
true .
正如你可以看到它保持10最大值,巫婆它是正確的,我需要像MAX = 10。爲什麼只是讓我真實?
您現在在最常見的情況下也能得到答案,這非常好!但是,他們目前仍然過於具體:由於不太承諾,你在最普遍的情況下就失去了解決方案。一個很好的聲明性的解決方案是寫'max(A,B,C): - max(A,B)#= C.'。這在最一般的情況下也能正常工作。 – mat
實例化錯誤並不一定是壞事:在@ CapelliC的答案中,他們保護if-then-else不會產生不完整的答案。但是,一旦你上面簡單的算術,你就不能再使用原始的if-then-else。有關更多信息,請參閱[this](http://stackoverflow.com/a/37057721/772868)。 – false
如果你真的堅持使用if-then-else,而不是寫:'max(A,B,C): - if_(A#> B,C#= A,C#= B)。 A,B,真): - A#> B.#>(A,B,false): - A#= false