的定义drotate
可以简化:
dapp( A-B, B-C, A-C).
drotate( [H|T]-T1, R-S) :- % (* dapp( T-T1, [H|L]-L, R-S).
%% dapp( A-B , B -C, A-C).
%% use the definition of dapp: *)
T = R, T1 = [H|L], L = S.
换句话说,简单地说,
drotate( [H|R]-[H|L], R-L).
现在,任何差异列表通常都写成一对,A-B
. 因此,调用drotate
可能是drotate( [1,2,3|Z]-Z, R-L)
为了查看R-L
变量中的输出。但是将此调用与最后一个定义匹配,我们得到Z = [1|L]
,即 logvar Z
,可能在调用之前未实例化,被它实例化,实际上添加1
到开放式列表的末尾[1,2,3|Z]-Z
,将其转换为[1,2,3,1|L]-L
。R
通过与列表匹配,只需指向新扩大列表的第二个元素[H|R]
。
?- drotate( [1,2,3|Z]-Z, R-L).
Z = [1|_G345]
R = [2, 3, 1|_G345]
L = _G345
Yes
但它也可以用真正的循环数据来调用,A-A = [1,2,3|Z]-Z, drotate( A-Z, R-L)
:
?- A-A = [1,2,3|Z]-Z, drotate( A-Z, R-L).
A = [1, 2, 3, 1, 2, 3, 1, 2, 3|...]
Z = [1, 2, 3, 1, 2, 3, 1, 2, 3|...]
R = [2, 3, 1, 2, 3, 1, 2, 3, 1|...]
L = [2, 3, 1, 2, 3, 1, 2, 3, 1|...]
Yes