在Prolog中配对2个词典

在Prolog中配对2个词典,prolog,Prolog,我需要在prolog中实现字典配对。这就是我所做的: pp((A, B), (B,C), RES) :- RES = [(A,C)]. pp((A, AA),[B|BS], RES) :- pp((A, AA), B, RES1), pp((A, AA), BS, RES2), append(RES1, RES2, RES). pp([A|AS], [B|BS], C) :- pp(A, [B|BS], RES1), pp(AS, [B|BS]

我需要在prolog中实现字典配对。这就是我所做的:

pp((A, B), (B,C), RES) :-
    RES = [(A,C)].

pp((A, AA),[B|BS], RES) :-
    pp((A, AA), B, RES1),
    pp((A, AA), BS, RES2),
    append(RES1, RES2, RES).

pp([A|AS], [B|BS], C) :-
    pp(A, [B|BS], RES1),
    pp(AS, [B|BS], RES2),
    append(RES1, RES2, RES),
    list_to_set(RES, C).
pp(_, _, C) :-
    C = [].
输出:

?- pp([(a,b),(b,c)],[(b,c),(c,z)],C).
C = [ (a, c), (b, z)] ;
C = [ (a, c)] ;
C = [ (a, c)] ;
C = [ (a, c)] ;
C = [ (a, c)] ;
C = [ (a, c), (b, z)] ;
C = [ (a, c)] ;
C = [ (a, c)] ;
C = [ (a, c)] ;
C = [ (a, c)] ;
C = [ (b, z)] ;
C = [] ;
C = [] ;
C = [] ;
C = [] ;
C = [ (b, z)] ;
C = [] ;
C = [] ;
C = [] ;
C = [] ;
C = [ (b, z)] ;
C = [] ;
C = [] ;
C = [] ;
C = [] ;
C = [].

?- 
第一个结果是正确的答案。问题是为什么谓词pp允许C是所有其他值?

Prolog将尝试它可以匹配的所有备选方案,然后您将这些结果作为算法中意外计算的结果

您正在“重载”pp/3,使用它来匹配列表和元素。 这没有什么意义,因为您的数据结构不是递归的

我认为你可以使用一些内置的,比列表到集合/2更容易应用的工具来获得相同的结果,而不是建议把切割放在周围(切割承诺完成选择,然后有助于避免令人兴奋的结果)

pp([],_,[]).
pp([(A,B)|As], X, [(A,C)|R]) :- select((B,C), X, Y), !, pp(As, Y, R).
% BUG ! pp([_|As], X, R) :- select(As, X, R).
pp([_|As], X, R) :- pp(As, X, R).
注意成功选择/3后的剪切,避免下面的“跳过规则”

编辑要从第二个词典中获取更多单词,让我们重试成功匹配:

pp([(A,B)|As], X, [(A,C)|R]) :- select((B,C), X, Y), !, pp([(A,B)|As], Y, R).
Prolog将尝试它可以匹配的所有备选方案,然后您将这些结果作为算法中意外计算的结果

您正在“重载”pp/3,使用它来匹配列表和元素。 这没有什么意义,因为您的数据结构不是递归的

我认为你可以使用一些内置的,比列表到集合/2更容易应用的工具来获得相同的结果,而不是建议把切割放在周围(切割承诺完成选择,然后有助于避免令人兴奋的结果)

pp([],_,[]).
pp([(A,B)|As], X, [(A,C)|R]) :- select((B,C), X, Y), !, pp(As, Y, R).
% BUG ! pp([_|As], X, R) :- select(As, X, R).
pp([_|As], X, R) :- pp(As, X, R).
注意成功选择/3后的剪切,避免下面的“跳过规则”

编辑要从第二个词典中获取更多单词,让我们重试成功匹配:

pp([(A,B)|As], X, [(A,C)|R]) :- select((B,C), X, Y), !, pp([(A,B)|As], Y, R).

我的命令式思维不能完全理解你的代码。但我忘了告诉你一个词可以匹配许多词,许多词可以匹配一个词。由于我缺乏Prolog方面的知识,我不知道如何在您的代码中更改它。但是,我成功地用cut修复了我的代码。很抱歉,出现了一个错误。select/3从第二个字典中删除匹配的元素。查看我的更新。我的命令式思维无法完全理解您的代码。但我忘了告诉你一个词可以匹配许多词,许多词可以匹配一个词。由于我缺乏Prolog方面的知识,我不知道如何在您的代码中更改它。但是,我成功地用cut修复了我的代码。很抱歉,出现了一个错误。select/3从第二个字典中删除匹配的元素。查看我的更新。