4

私はいくつかのプロローグの事実を持っています:

relation('Kitchen', [item(spoon), item(fork),  item(knife)  ]).
relation('Lounge',  [item(sofa),  item(chair), item(table)  ]).
relation('Bedroom', [item(bed),   item(desk),  item(drawers)]).

実行時に生成されるリスト。例:

[item(spoon), item(knife)]

このリストから、この場合、'Kitchen' が最も一致するので返してもらいたいと思います。

述語を使用して実行時リストに一致する数を取得する必要があると思うので、Kitchen は 2 を返し、他のものは 0 を返しますが、すべての述語intersection/3を再帰する方法がわかりません。relation/2最適な一致のみを返す前に、それぞれをテストします。

4

1 に答える 1

1

最善の解決策は、改善できないものです: \+ better_candidate(Goal,CurSolution). もちろん、単純な長さの比較の代わりに、より複雑な比較手法を実装できます。

:- use_module(library(lists)).

relation('Kitchen', [item(spoon), item(fork),  item(knife)  ]).
relation('Lounge',  [item(sofa),  item(chair), item(table)  ]).
relation('Bedroom', [item(bed),   item(desk),  item(drawers)]).

best(X,Best) :-
    relation(Best,BestList), intersection(X,BestList,I),
    length(I,L),
    \+ better_candidate(X,L).

better_candidate(X,L) :-
    relation(C,CList), intersection(X,CList,CI),
    length(CI,CIL), CIL > L.
于 2012-04-19T19:45:46.730 に答える