Изменение порядка имен переменных
Как написать стандартным образом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].