Prolog,寻找最佳匹配

时间:2012-04-19 19:02:29

标签: prolog pattern-matching intersection

我有几个序言事实:

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',因为它是最佳匹配。

我想我需要使用intersection/3谓词来计算运行时列表中有多少匹配,所以Kitchen会返回2而其他人会返回0,但我不知道在返回最佳匹配之前,递归所有relation/2谓词并测试每个谓词的方法。

1 个答案:

答案 0 :(得分: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.