Подтвердить что ты не робот

Союз двух переменных множеств

Учитывая два списка переменных, что является самым компактным и каноническим способом в ISO Prolog, чтобы определить объединение обоих? То есть, мы хотим определить (мета-логические) предикаты

varset_union(VarSet1, VarSet2, Union)

и для списка списков

varset_union(VarSets, Union)

где Union - список уникальных переменных данного VarSet s.

Ниже приведен обзор встроенных модулей в ISO/IEC 13211-1:1995, включая Cor.2: 2012.

4b9b3361

Ответ 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).

Ответ 2

Основываясь на Tudor отличный ответ, я разработал определение varset_union/3, которое больше compact на 2 символа:

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

; -)