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].

Antworten auf die Frage(4)

Ihre Antwort auf die Frage