如何avs_term_rearranged(AVs, T, AVsR)
使用给定的标准以符合标准的方式编写AVs
,T
这AVsR
就是AVs
元素的排列顺序相同,因为它们的变量以从左到右的顺序出现在T
.
AVs
是形式元素的列表,A = V
其中A
是指定变量名称的原子,如'X'
并且V
是相应的变量。此类列表由read_term/2,3
带有 read-option 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 a)。
以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].