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

从这个列表中,在这种情况下,我希望返回“厨房”,因为它是最佳匹配。

我想我需要使用intersection/3谓词来计算运行时列表中有多少匹配项,所以 Kitchen 会返回 2 而其他人会返回 0,但我不知道递归所有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 回答