Prolog List元素相似性比较

时间:2019-07-13 18:54:13

标签: tree prolog trie

我偶然发现了这个question

问题在于找到两个列表的数字之间存在多少个相等的结尾数字。给出的答案似乎很有效,使用树来实现类似于trie的东西。但是,在使用它的过程中,我发现它的行为与我预期的有所不同:当第二个列表中有多个“单词”与第一个列表中的一个具有“相似性”时,返回一个仅与一个匹配词之一的匹配位数一起出现一次。为每场比赛返回答案会更正确吗?

我试图思考如何做到这一点,但是我无法提出任何好的建议(我是序言中的初学者...)

为方便起见,我发布了gusbro的answer中的代码:

same_endings(L1, L2, Endings):-
  build_tree(L1, Tree),
  maplist(same_ending(Tree), L2, Endings).

same_ending(Tree, N, N-Len):-
  atom_chars(N, Digs),
  reverse(Digs, RDigs),
  same_ending1(RDigs, Tree, 0, Len).

same_ending1([], _, Len, Len).
same_ending1([Dig|Digs], Tree, Len, Len2):-
  (select(Dig-SubTree, Tree, _) ->
    (succ(Len, Len1), same_ending1(Digs, SubTree, Len1, Len2)) ;
    Len2=Len
  ).

build_tree(L, Tree):-
  foldl(add_tree, L, [], Tree).

add_tree(N, Tree, NTree):-
  atom_chars(N, Digs),
  reverse(Digs, RDigs),
  add_tree1(RDigs, Tree, NTree).

add_tree1([], Tree, Tree).
add_tree1([Dig|Digs], Tree, [Dig-SubTree1|Tree1]):-
  (select(Dig-SubTree, Tree, Tree1) -> true; SubTree-Tree1=[]-Tree),
  add_tree1(Digs, SubTree, SubTree1).

示例:

same_endings([123,223,333],[423,433],Endings).
Endings = [423-2, 433-2].

我希望更合理的答案是

Endings = [423-2, 423-2, 423-1, 433-1, 433-1, 433-2].

0 个答案:

没有答案