7

我一直在阅读关于差异列表的巨大差异,我希望能测试书中的一些示例。但似乎您不能以与 append([1,2,3], [4,5], X) 相同的方式将列表作为输入传递,其中 X=[1,2,3, 4,5]。奇怪的是,我查阅过的任何一本书都没有提到这一点。

我在 swipl 上运行代码,我有兴趣测试一个差异附加谓词:

dapp(A-B,B-C,A-C).

和“旋转列表的第一个元素”谓词:

drotate([H|T]-T1,R-S) :- dapp(T-T1,[H|L]-L,R-S).

任何想法,我如何在 swipl 中测试这些谓词?

4

2 回答 2

7

尝试:

dapp([1,2,3|X] - X,[4,5,6] - [],Y - []).
drotate([1,2,3|X] - X,Y - []).

Y 是两个谓词的答案。

于 2011-07-09T14:54:15.663 回答
2

的定义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]-LR通过与列表匹配,只需指向新扩大列表的第二个元素[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
于 2012-01-31T20:52:31.770 回答