我一直在阅读有多大的差异列表,我希望从书中测试一些例子。但似乎你不能以与插入([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中测试这些谓词?
答案 0 :(得分:7)
尝试:
dapp([1,2,3|X] - X,[4,5,6] - [],Y - []).
drotate([1,2,3|X] - X,Y - []).
Y是两个谓词的答案。
答案 1 :(得分:2)
drotate
的定义可以简化:
dapp(A-B,B-C,A-C).
drotate([H|T]-T1,R-S) :- % dapp(T-T1,[H|L]-L,R-S).
%% 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]
与列表匹配即可指向新放大列表的第二个elt。
?- 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