我有一個問題,其中有一個元素列表,我必須遍歷特定/ 2謂詞的所有實例以查找哪一個具有最高匹配數列表中的元素。在實施方面,我似乎無法弄清楚我應該如何更新迄今爲止最高的比賽,然後在沒有更多比賽時停止。從Prolog中的謂詞知識庫中找到最相似的列表
findAnswer(MyList, HighMatchNum,_):-
answer(X,Y),
myIntersection(MyList, Y, NUM), //handles a single instance check and returns how many elements match.
NUM > HighMatchNum,
findAnswer(MyList, NUM, answer(X,Y)).
//Knowledge base
answer(sample1, [a,b,c,d]).
answer(sample2, [d,c,e]).
它將* *肯定失敗,結果會在數據庫中斷言。而且,'findAnswer'將始終從所有'answer'事實的開始處開始。如果您可以使用非標準解決方案,則最好在SWI中使用'nb_setval',並結合'fail'來實現線性搜索。 – 2013-04-28 14:42:12
它肯定會失敗,謝謝。我只是簡單地通過添加一個帶有兩個實現的助手謂詞來工作,一個會調用findAnswer,如果失敗,第二個會檢索值。 – 2013-04-28 14:53:25
是的,這是可能的。這涉及搜索的後果。我指的是搜索本身。你的'findAnswer'跳過了可能的解決方案,但是當它發現一個比當前最大的解決方案長時,它會再次調用'findAnswer',它將從第一個答案開始重新開始,而不是從當前最長的答案開始。我正是這個意思。 :)嗯,我現在也注意到你必須在最後一次調用'findAnswer'之前插入一個剪輯。 – 2013-04-28 15:04:07