Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Prolog中从Haskell编写init函数_Prolog_Code Translation - Fatal编程技术网

如何在Prolog中从Haskell编写init函数

如何在Prolog中从Haskell编写init函数,prolog,code-translation,Prolog,Code Translation,制定适当的Prolog规则initXs,Ys,如果 只有当Ys是Xs的初始部分时 即查询 init[1,2,3,4,5],[1,2,3,4]。将计算为true,或查询 init[1,2,3,4,5],Ys。将给出Ys=[1,2,3,4] 首先将定义转换为一种形式: 初始[]=[] init x:xs=rs,其中{rs=x:ys;ys=init xs} 在Prolog翻译中不需要也不需要类型签名 现在做句法上的胡言乱语: init :: [a] -> [a] init [_] = [] in

制定适当的Prolog规则initXs,Ys,如果 只有当Ys是Xs的初始部分时

即查询 init[1,2,3,4,5],[1,2,3,4]。将计算为true,或查询 init[1,2,3,4,5],Ys。将给出Ys=[1,2,3,4]


首先将定义转换为一种形式:

初始[]=[] init x:xs=rs,其中{rs=x:ys;ys=init xs} 在Prolog翻译中不需要也不需要类型签名

现在做句法上的胡言乱语:

init :: [a] -> [a]
init [_] = []
init (x:xs) = x : init xs
由于在Haskell中只有第一个匹配子句激发,即每个子句后面都有一个隐式剪切,因此添加剪切:

init([_] , []).
init([X|XS] , RS)  :-    RS = [X|YS],    init( XS, YS) .

完成。

将Haskell代码直接翻译成Prolog代码如下:

initc([_] , []) :- !.
initc([X|XS] , RS)  :-   RS = [X|YS],    initc( XS, YS) .
直接翻译的结果:

init([_], []) :- !.
init([X|Xs], [X|Ys]) :-
   init(Xs, Ys).
init(_, []).            % assuming that first argument is any list!

init([X|Xs], [X|Ys]) :-
   init(Xs, Ys).
但是,正如定义的那样,谓词init/2不能正常工作,因为列表可以有几个不同的初始部分或前缀。因此,稍微好一点的翻译是:

?- init([1,2,3,4,5], [1,2,3,4]).
true.

?- init([1,2,3,4,5], Ys).
Ys = [1, 2, 3, 4].

?- init([1,2,3,4,5], [1,2,3]). % does not work properly!
false.
修改翻译后的结果:

init([_], []) :- !.
init([X|Xs], [X|Ys]) :-
   init(Xs, Ys).
init(_, []).            % assuming that first argument is any list!

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

查看一下它的源代码,点击右上角的:-按钮“当且仅当需求无法满足时”。if will have do.initXs,Ys:-附录,[[u],Xs。既然这个问题已经有了两个完全有效的答案,为什么这个问题就结束了?@DavidTonhofer,我也不知道。这可能是因为OP并没有表现出任何努力,或者它看起来像是一开始我并没有注意到的剪切粘贴作业。但关闭的理由似乎并不适用。或者也许这意味着OP的工作细节缺失了。。。我已经删除了haskell标签,这样它就不会对haskell社区造成太大的麻烦,这样它就可以被投票重新开放了。@DavidTonhofer:看看那些关闭者。所有的标签。这个伤口很痛。@false我同时把它去掉了,但是你能告诉我具体的位置和原因吗?我试过有没有它的例子,看不出问题所在。我想我要恢复它,因为它隐含在Haskell中,这是一种函数式语言。但是函数式语言在稳定性方面没有问题。然而,带删节的序言确实如此。@谢谢你的澄清。函数式语言在稳定性方面没有问题,因为它们没有这样的概念。为了让Prolog代码模拟功能代码,可以理解的是,输入变量总是已经实例化了。查询X=[1,2],initCutX,u是对应于Haskell调用let{{uu=init[1,2]}的,但是有问题的查询initCutX,X=[1,2]不对应于任何Haskell调用,因此有人可以合理地认为它也应该被忽略。init[1,2,3,4,5],[1,2,3]。结果在有和没有切割的情况下都是错误的,这是应该的。Will Ness,我认为查询init的正确答案是[1,2,3,4,5],[1,2,3]。应该是正确的,因为[1,2,3]是[1,2,3,4,5]的初始部分。但是,正如我之前所说的,带有cut的直译结果是错误的。因此,我建议对直译进行修改,不使用cut,并假设第一个参数是产生正确答案的任何列表。不,这是关于Haskell中定义的特定函数。它相当于initA,B:-附录B,[[u],A。。它不是一般的前缀函数:这取决于开头部分的含义。语言可以有任何意义。init是Haskell中现有的库函数,其编码如问题所示:OP的示例是查询init[1,2,3,4,5],Ys。将给出Ys=[1,2,3,4]也符合其在Haskell中被接受的含义。无论如何,init是一个选择不当的词。