测试Prolog差异列表

时间:2011-07-09 14:46:10

标签: list prolog difference-lists

我一直在阅读有多大的差异列表,我希望从书中测试一些例子。但似乎你不能以与插入([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中测试这些谓词?

2 个答案:

答案 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]-LR只需将[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