我的一个考试有这个复习问题,我需要一些指导。
使用以下Prolog程序作为可执行规范,
mix(Xs,Ys):-remix(Xs,[],Ys). remix([],Ys,Ys). remix([X|Xs],Ys,Zs):-remix(Xs,[X|Ys],Zs).
编写一个等效的Haskell程序。
这就是我目前为Haskell代码所做的:
mix Xs Ys = remix Xs [] Ys
remix [] Ys Zs = Zs
remix (X:Xs) Ys Zs = x : (remix Xs Ys Zs)
这个Haskell程序是否等同于上面的Prolog代码?如果没有,我做错了什么?
答案 0 :(得分:3)
字面翻译将是:
mix xs = remix xs []
remix [] ys = ys
remix (x:xs) ys = remix xs (x:ys)
假设 mix/2
的第一个参数严格地是输入参数,mix/2
和remix/3
的最后一个参数是输出参数。然后,Haskell 函数将您正在翻译的Prolog 谓词的最后一个参数作为返回值。否则,Haskell版本与Prolog完全相同,只是正确的Haskell语法。将它与您的尝试相比较,您将看到许多小差异(我猜Haskell编译器也会告诉您这些差异吗?)
(如果这是错误的话,请Haskellers纠正我)
但是有一些问题。可以通过两种方式查询原始的Prolog程序:
?- mix([1,2,3], M).
M = [3, 2, 1].
?- mix(M, [3,2,1]).
M = [1, 2, 3] .
甚至:
?- mix(X, Y), numbervars(X-Y, 0, _).
X = Y, Y = [] ;
X = Y, Y = [A] ;
X = [A, B],
Y = [B, A] ;
X = [A, B, C],
Y = [C, B, A] ;
X = [A, B, C, D],
Y = [D, C, B, A] . % and so on
但是,第二个查询会留下一个选择点,如果您尝试查看可能获得的其他解决方案(键入Space或;
而不是Enter),则该程序不会终止。它是否说如何使用原始Prolog程序?