prolog - 需要解释联合和交集

时间:2011-04-23 02:29:31

标签: prolog

/* 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,[]).

你们可以清楚地解释这些表达方式,也许是在树上,非常感谢。我对prolog很新:)

1 个答案:

答案 0 :(得分:4)

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

union规则基本上采用两个列表并返回它们的并集,例如。 union(List1,List2,UnionOfList1AndList2)

第一条规则

union([A|B], C, D) :- member(A, C), !, union(B, C, D)

如果member(A, C)匹配,则匹配(假设member(A, C)匹配,如果C是包含绑定到A的值的列表,则!是切割,如果我们达到此值,我们可以'从这里回来。然后我们在左侧解决列表的其余部分。

基本上我们说如果List1的HEAD在List2中,那么结果是与List2联合的List1的尾部的并集。 (这在技术上是对正在发生的事情的错误描述,但我相信它会做:D)

union([A|B], C, [A|D]) :- union(B, C, D)

鉴于我们已经处理了A在List2中的情况,我们知道这次A不在List2中,所以我们将它添加到union(B,C,D)的“结果”中。

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

交叉口规则并没有太大差异。