Союз двух переменных множеств
Учитывая два списка переменных, что является самым компактным и каноническим способом в ISO Prolog, чтобы определить объединение обоих? То есть, мы хотим определить (мета-логические) предикаты
varset_union(VarSet1, VarSet2, Union)
и для списка списков
varset_union(VarSets, Union)
где Union
- список уникальных переменных данного VarSet
s.
Ниже приведен обзор встроенных модулей в ISO/IEC 13211-1:1995, включая Cor.2: 2012.
Ответы
Ответ 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).
; -)