【问题标题】:Union of two variable sets两个变量集的并集
【发布时间】:2014-12-10 01:35:37
【问题描述】:

给定两个变量列表,在 ISO Prolog 中确定两者并集的最紧凑和规范的方法是什么?也就是说,我们想要一个(元逻辑)谓词的定义

varset_union(VarSet1, VarSet2, Union)

对于列表列表

varset_union(VarSets, Union)

其中Union 是给定VarSets 的唯一变量列表。

这是 ISO/IEC 13211-1:1995 中的 overview of the built-ins,包括 Cor.2:2012。

【问题讨论】:

    标签: prolog iso-prolog


    【解决方案1】:

    使用term_variables/2的解决方案:

    varset_union(VarSet1, VarSet2, Union):-
        term_variables([VarSet1|VarSet2], Union).
    
    varset_union(VarSets, Union):-
        term_variables(VarSets, Union).
    

    使用setof/3的解决方案:

    varset_union(VarSet1, Varset2, Union):-
        varset_union([VarSet1, VarSet2], Union).
    
    varset_union([], []).
    varset_union(VarSets, Union):-
        setof(Var, VarSet^(member(VarSet, VarSets), member(Var, VarSet)), Union).
    

    【讨论】:

    • 请注意,setof/3 的定义将按实现相关顺序生成变量列表 - 这意味着基本上是随机顺序 - 而 term_variables/2 具有明确定义的顺序。
    • 就效率而言,setof/3 解决方案要差得多[至少在 SWI-Prolog 中]。
    • setof/3 使用term_variables/2 来确定要处理的变量。而这只是第一步……
    【解决方案2】:

    根据 Tudor 的出色回答,我设计了 varset_union/3 的定义,即 更紧凑 2 个字符:

    varset_union(VarSet1, VarSet2, Union):-
            term_variables(VarSet1+VarSet2, Union).
    

    ;-)

    【讨论】:

    • 在许多实现中,这会更慢(如在 SWI 中)和/或消耗更多空间(如在 SICStus、YAP 中)。
    • 我一直在努力达到您要求的标准:紧凑且规范。 Union 和+ 密切相关,所以在这里使用+ 至少是很自然的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多