Как написать стандартным образом 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являются переменными, которые не идентичны, тоXterm_precedesYдолжен быть зависимым от реализации, за исключением того, что во время создания отсортированного списка (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].