1

要素のリストがあり、特定の /2 述語のすべてのインスタンスを循環して、リスト内の一致する要素の数が最も多いものを見つける必要があるという問題があります。実装に関しては、これまでに最高の一致を更新し、それ以上ないときに停止する方法を理解できないようです。

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]).
4

3 に答える 3

2

最良のものを見つけるには、リスト全体を最後まで検索する必要があります。これまでの最高値とそのスコアを追加の引数として維持します。

best_match(MyList,R-RN):-
  findall(X, (answer(A,L), X=A-L), ALL),
  ALL = [A-L|T],
  myIntersection(MyList, L, N),
  find_best(MyList,T,A,N,R,RN).

find_best(_,[],A,N,A,N).
find_best(MyList,[B-H|T],A,N,R,RN):-
  myIntersection(MyList, H, K),
  ( K>N -> find_best( MyList, T, B, K, R, RN)
    ;      find_best( MyList, T, A, N, R, RN ).

これにより、最適な一致の名前とスコアが生成されます。

于 2013-04-28T14:34:13.380 に答える
2

ライブラリ(集約)があります:

findAnswer(MyList, HighMatchNum, K) :-
    aggregate_all(max(N, Key),
              (   answer(Key, List),
                  myIntersection(MyList, List, N)
              ),
              max(HighMatchNum, K)).

myIntersection(MyList, List, N) :-
    intersection(MyList, List, L),
    length(L, N).

% Knowledge base
answer(sample1, [a,b,c,d]).
answer(sample2, [d,c,e]).

収量

?- findAnswer([a], C, K).
C = 1,
K = sample1.

?- findAnswer([d,e], C, K).
C = 2,
K = sample2.
于 2013-04-28T14:40:51.857 に答える