如何以符合标准的方式写出
作为一个例子:
avs_term_rearranged(AVs, T, AVsR)
,其中 AVs
和 T
已知,使得 AVsR
是 AVs
的排列,元素按照它们在 T
中从左到右出现的顺序进行排列。
AVs
是一个由形如 A = V
的元素组成的列表,其中 A
是指代变量名(例如 'X'
)的原子,而 V
则是相应的变量。这样的列表是由带有读取选项 variable_names/1
(7.10.3)的 read_term/2,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].
T
并赋予了不同的含义。为避免混淆,重命名其中一个可能会有所帮助。 - Christian FritzT
被用作所寻谓词的参数,另一次它与read_term
一起使用,在这种情况下,它会产生T
和AVs
,使它们适合于谓词。 - falseavs_term_rearranged(['A'=A,'B'=B,'C'=C], A+C+F+B, ['A'=A,'C'=C,'B'=B])
? - Christian Fritzream_term/3
从使用write_term/3
写入的流中读取,就可以获得与AVs
相符合的T
变量表示,并在那一点上,将T
变量中不出现在AVs
变量中的所有变量丢弃即可。 - Christian Fritzread_term / 3
和write_term / 3
确实使用相同的格式。确定空变量在这里:https://dev59.com/xVzUa4cB1Zd3GeqP57vj#7948525 - false