将 Prolog 程序转换为 Haskell 程序

Converting a Prolog program to a Haskell program

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

Using the following Prolog program as an executable specification,

mix(Xs,Ys):-remix(Xs,[],Ys).

remix([],Ys,Ys).    
remix([X|Xs],Ys,Zs):-remix(Xs,[X|Ys],Zs).

write an equivalent Haskell program.

这是我目前的 Haskell 代码:

mix Xs Ys = remix Xs [] Ys

remix [] Ys Zs = Zs

remix (X:Xs) Ys Zs = x : (remix Xs Ys Zs)

这个Haskell程序是否等同于上面的Prolog代码?如果不是,我做错了什么?

直译为:

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

假设 mix/2 的第一个参数严格来说是输入参数,mix/2remix/3 的最后一个参数都是输出参数。然后,Haskell 函数 将您正在翻译的 Prolog predicates 的最后一个参数作为 return 值。否则,Haskell 版本与 Prolog 完全相同,只是正确的 Haskell 语法。将它与您的尝试进行比较,您会发现很多细微差别(我想 Haskell 编译器也会告诉您这些?)

(Haskell如有错误请指正)

但是这有一些问题。可以通过两种方式查询原始 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 程序?