/* 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很新:)
答案 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。
交叉口规则并没有太大差异。