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