Изменение порядка имен переменных

Как написать стандартным образомavs_term_rearranged(AVs, T, AVsR) с учетомAVs а такжеT такой, чтоAVsR это перестановкаAVs с элементами, расположенными в том же порядке, в котором их переменные располагаются слева направо в.T

AVs список элементов формыA = V гдеA это атом, обозначающий имя переменной, как'X' а такжеV является соответствующей переменной. Такие списки составляютсяread_term/2,3 с опцией чтенияvariable_names/1 (7.10.3). Кроме того, точный порядок элементов не определен.

| ?- read_term(T,[variable_names(AVs)]).
A+B+A+_+C.

AVs = ['A'=A,'B'=B,'C'=C]
T = A+B+A+_+C

T это термин, который содержит все переменныеAVs плюс еще немного.

Обратите внимание, что в стандартной программе соответствия нельзя полагаться на порядок терминов для переменных (7.2.1):

7.2.1 Переменная

ЕслиX а такжеY переменные, которые не идентичны, тоX term_precedes Y должен зависеть от реализации, за исключением того, что при создании отсортированного списка (7.1.6.5, 8.10.3.1 j) порядок должен оставаться постоянным.

НОТА - ЕслиX а такжеY обе анонимные переменные, то они не являются одинаковыми терминами (см. 6.1.2 а).

Рассмотрим в качестве примераиз 8.4.3.4:

sort([f(U),U,U,f(V),f(U),V],L).
   Succeeds, unifying L with [U,V,f(U),f(V)] or
   [V,U,f(V),f(U)].
   [The solution is implementation dependent.]

Таким образом, есть два возможных способаsort/2 будет работать, и нельзя даже полагаться на успех:

sort([f(U),U,U,f(V),f(U),V],L), sort(L, K), L == K.

В качестве примера:

?- avs_term_rearranged(['A'=A,'B'=B,'C'=C], A+C+F+B, AVsR).
   AVsR = ['A'=A,'C'=C,'B'=B].

Ответы на вопрос(4)

Ваш ответ на вопрос