将Prolog程序转换为Haskell程序

时间:2015-03-23 09:11:30

标签: haskell prolog

我的一个考试有这个复习问题,我需要一些指导。

  

使用以下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代码?如果没有,我做错了什么?

1 个答案:

答案 0 :(得分:3)

字面翻译将是:

mix xs = remix xs []
remix [] ys = ys
remix (x:xs) ys = remix xs (x:ys)

假设 mix/2的第一个参数严格地是输入参数,mix/2remix/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程序