Объединение двух наборов переменных

17

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

varset_union(VarSet1, VarSet2, Union)

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

varset_union(VarSets, Union)

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

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

    
задан false 10.12.2014 в 02:35
источник

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).
    
ответ дан Tudor Berariu 10.12.2014 в 14:26
  • Обратите внимание, что определение с помощью setof / 3 приведет к получению списка переменных в зависимом от реализации порядке - что означает существенно случайный порядок, тогда как term_variables / 2 имеет четко определенный порядок. –  false 10.12.2014 в 18:26
  • И с точки зрения эффективности решение setof / 3 намного хуже [по крайней мере в SWI-Prolog]. –  Tudor Berariu 10.12.2014 в 18:50
  • setof / 3 использует term_variables / 2 для определения переменных, подлежащих обработке. И это только первый шаг ... –  false 10.12.2014 в 20:15
2

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

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

; -)     

ответ дан mat 24.12.2015 в 15:05
  • Во многих реализациях это будет медленнее (например, в SWI) и / или потребляет больше места (например, в SICStus, YAP). –  false 25.12.2015 в 17:22
  • Я стремился к критериям, которые вы просили: Компактный и канонический. Союз и + тесно связаны, поэтому, по крайней мере, очень естественно использовать + здесь. –  mat 25.12.2015 в 17:41