17

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

varset_union(VarSet1, VarSet2, Union)

和列表列表

varset_union(VarSets, Union)

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

以下是ISO/IEC 13211-1:1995 中内置函数的概述,包括 Cor.2:2012。

4

2 回答 2

13

解决方案使用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).
于 2014-12-10T13:26:42.990 回答
2

基于 Tudor 的出色回答,我设计了一个varset_union/3紧凑的 2 个字符的定义:

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

;-)

于 2015-12-24T14:05:30.320 回答