【问题标题】:prolog - need to explain union and intersectionprolog - 需要解释并集和交集
【发布时间】:2011-08-11 07:55:18
【问题描述】:
/* 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 很陌生 :)

【问题讨论】:

    标签: prolog


    【解决方案1】:

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

    联合规则本质上采用两个列表并返回它们的联合,例如。 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 中,那么结果就是 List1 的尾部与 List2 的联合。 (这在技术上是对正在发生的事情的错误描述,但我相信它会这样做: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。

    相交规则并没有本质上的不同。

    【讨论】:

    • 感谢您的回答,我刚刚在 IRC 中得到了很好的解释,这与您的回答非常相似 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多