Prolog 序言-需要解释并集和交集

Prolog 序言-需要解释并集和交集,prolog,Prolog,你们能解释清楚这些表达方式吗,也许在树上,谢谢。我对prolog很陌生:)我对prolog的记忆有些生疏,但我认为它是这样的: union规则基本上接受两个列表并返回它们的union,例如union(列表1、列表2、UNIONOFLIST1和列表2) 第一条规则 /* e */ union([A|B], C, D) :- member(A,C), !, union(B,C,D). union([A|B], C, [A|D]) :- union(B,C,D). union([],Z,Z). /*

你们能解释清楚这些表达方式吗,也许在树上,谢谢。我对prolog很陌生:)

我对prolog的记忆有些生疏,但我认为它是这样的:

union规则基本上接受两个列表并返回它们的union,例如union(列表1、列表2、UNIONOFLIST1和列表2)

第一条规则

/* e */
union([A|B], C, D) :- member(A,C), !, union(B,C,D).
union([A|B], C, [A|D]) :- union(B,C,D).
union([],Z,Z).

/* f */
intersection([A|B], C, D) :- member(A,C), !, intersection(B,C,D).
intersection([A|B], C, [A|D]) :- intersection(B,C,D).
intersection([],Z,[]).
如果
成员(A,C)
匹配(假设
成员(A,C)
匹配,如果C是包含绑定到A的值的列表),
,则这将匹配是一个切入点,因此如果我们达到这一点,就无法从这里返回轨迹。然后,我们解析左侧列表的其余部分

基本上我们是说,如果列表1的头部在列表2中,那么结果就是列表1的尾部与列表2的并集。(从技术上讲,这是对正在发生的事情的不正确描述,但我相信它可以做到:D)

考虑到我们已经处理了A在列表2中的情况,我们知道这一次A不在列表2中,所以我们将其前置到并集(B,C,D)的“结果”中

最后,
union([],Z,Z)
表示如果List1为空,则List1和List2的并集为List2


交叉口规则没有本质上的不同。

谢谢你的回答,我刚刚在IRC中得到了一个很好的解释,它与你的回答非常相似:)
union([A|B], C, D) :- member(A, C), !, union(B, C, D)
union([A|B], C, [A|D]) :- union(B, C, D)