我有這樣的事實清單:序言 - 停止重複時,最後的事實
set(h, 3).
set(h, 6).
set(h, 12).
set(h, 1).
set(h, 7).
我需要找到一套H的最大值和查詢需要看起來像這樣:
?- maximum(h, Max).
Max = 12.
顯然,現在有很多方法可以做到這一點。但目前我正在尋找一種方法來實現動態謂詞和失敗謂詞。我可能不得不重複我猜測?不幸的是,重複和動態謂詞似乎讓我感到困惑。
我的想法是這樣的:
set(h, 3).
set(h, 6).
set(h, 12).
set(h, 1).
set(h, 7).
:- dynamic current_max/1.
assert(current_max(0)).
maximum(Set, Element):-
repeat,
set(Set,Element),
current_max(Max),
(Max > Element,
fail);
(Element > Max,
retract(current_max(Max)),
assert(current_max(Element)),
fail).
maximum(_, Max):-
current_max(Max).
一個我看到自己是在重複週期不會停止的問題。如果我不知何故知道這是我可能使用剪輯的最後一個元素,但我不知道如何。
男人,我會說實話。這似乎是在另一個層面上,我還有很多東西需要學習(state,arg,nb_setarg,nonvar等)。 是否沒有辦法使它保持最大值的動態謂詞?或者重複一遍。我正在努力處理那些具體的問題。 另外,如果我真的想讓它與原子一起工作呢?所以它會先數字,然後是字母(a-z)?這可能嗎? – PadaKatel
@PadaKatel在這裏你確實不需要'repeat',因爲'set/2'會創建選擇點。在答案的開頭,我展示了失敗驅動循環的外觀,以及如何使用它來解決您的問題;收回+斷言你已經在你的問題是「副作用」。但請記住,按你想要的方式做它本質上是破碎的,只能用於學習目的! – 2016-12-01 15:34:33
嘿。我給另一個評論寫了另一個代碼示例。 – PadaKatel