测试Prolog差分列表

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中测试这些谓词?
2个回答

7

尝试:

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

Y是两个谓词的答案。


做到了!我从没想过尝试 Y-[] ,谢谢! - Daniel Loureiro
1
实际上,它可以是任何东西,只要确保第二个和第三个参数相同。例如:dapp([1,2,3|X] - X,[4,5,6] - Z,Y - Z)。 - LeleDumbo

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,2,3|Z]-Z的末尾添加1,将其转换为[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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接