簡體   English   中英

從事實列表中找到最大的序言

[英]prolog finding max from a list of facts

嗨,抱歉,我真的是Prolog的新手。 假設我有一個事實列表,說6個事實,第一列數字代表人員ID,第二列代表一個人的獲勝次數。 如果我想找到獲勝最多的人,我將如何去做?

wins(1, 22).
wins(2, 24).
wins(3, 23).
wins(4, 20).
wins(5, 21).
wins(6, 19).

這樣的東西? 老實說,我真的不知道我在做什么

X = wins(_, Xs) 
Y = wins(_, Ys)
most wins(X) :- Xs > Ys  

獲得該信息的方法不止一種。

most_wins(Id) :-
    wins(Id, W), \+ (wins(_, W1), W1 > W).

或者,如果您的Prolog具有library( aggregate ):

most_wins(Id) :-
    aggregate(max(W, Id), wins(Id, W), max(_, Id)).

或者您可以使用setof / 3

most_wins(Id) :-
    setof(N-Id, W^(wins(Id, W), N is -W), [_-Id|_]).

有明顯的速度/內存折衷:第一種方法是提高內存效率,即O(1),但是時間復雜度為O(N ^ 2),因為它掃描的是候選集的2倍。 第二個和第三個(在我看來)實際上是等效的,在SWI-prolog中的當前實現下,都建立候選列表(然后是空間中的O(N)),然后及時選擇元素-O(N log N)。

如果候選人是事實 ,則首先選擇。

編輯從效率的角度來看,更好的方法是利用不可回溯的分配。 只需掃描候選人,即可隨時隨地保持最高水平。 Plain Prolog將需要斷言/收回來執行此類任務,從而使其效率低下。 但是許多Prologs都有更有效的方式來存儲“全局”變量...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM