Variablennamen neu anordnen
So schreiben Sie standardkonformavs_term_rearranged(AVs, T, AVsR)
mit gegebenAVs
undT
so dassAVsR
ist eine Permutation vonAVs
wobei die Elemente in derselben Reihenfolge angeordnet sind, in der ihre Variablen in der Reihenfolge von links nach rechts vorkommenT
.
AVs
ist eine Liste von Elementen des FormularsA = V
woA
ist ein Atom, das einen Variablennamen wie'X'
undV
ist eine entsprechende Variable. Solche Listen werden erstellt vonread_term/2,3
mit der read-optionvariable_names/1
(7.10.3). Außerdem ist die genaue Reihenfolge der Elemente nicht definiert.
| ?- read_term(T,[variable_names(AVs)]).
A+B+A+_+C.
AVs = ['A'=A,'B'=B,'C'=C]
T = A+B+A+_+C
T
ist ein Begriff, der alle Variablen von enthältAVs
und noch mehr.
Beachten Sie, dass man sich in einem standardkonformen Programm nicht auf die Termreihenfolge für Variablen verlassen kann (7.2.1):
7.2.1 Variable
WennX
undY
sind Variablen, die dann nicht identisch sindX
term_precedes Y
muss implementierungsabhängig sein, mit der Ausnahme, dass während der Erstellung einer sortierten Liste (7.1.6.5, 8.10.3.1 j) die Reihenfolge konstant bleibt.
HINWEIS - WennX
undY
Sind beide anonymen Variablen, dann handelt es sich nicht um identische Begriffe (siehe 6.1.2 a).
Betrachten Sie als Beispielvom 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.]
Es gibt also zwei Möglichkeiten, wiesort/2
wird funktionieren, und man kann sich nicht einmal auf den Erfolg verlassen von:
sort([f(U),U,U,f(V),f(U),V],L), sort(L, K), L == K.
Als Beispiel:
?- avs_term_rearranged(['A'=A,'B'=B,'C'=C], A+C+F+B, AVsR).
AVsR = ['A'=A,'C'=C,'B'=B].