用于反转和追加列表的Prolog程序

用于反转和追加列表的Prolog程序,prolog,Prolog,我不熟悉prolog。我试图颠倒列表的顺序并附加它们 例如: revappend([1,2],[3,4],X)应该给出如下结果: X=[3,4,1,2] 我写的代码是: revappend([],List,List). revappend(InputListB,[Head|InputListA], [Head|OutputList]):- revappend( InputListA, InputListB, OutputList). 给我的结果是: X=[15,11,16,12,13,1

我不熟悉prolog。我试图颠倒列表的顺序并附加它们

例如:

revappend([1,2],[3,4],X)应该给出如下结果:

X=[3,4,1,2]

我写的代码是:

revappend([],List,List).
revappend(InputListB,[Head|InputListA], [Head|OutputList]):-
   revappend( InputListA, InputListB, OutputList).
给我的结果是:

X=[15,11,16,12,13,14]


有人能告诉我怎么做吗

append(List,[],List).
append(List,[Head|Tail],[Head|Res]):-append(List,Tail,Res).
第一条规则是,当第二个列表为空时,将第一个列表附加到结果中


第二条规则是,将第二个列表的开头添加到结果中,然后递归地将第二个列表的结尾附加到第一个列表。

您希望颠倒列表的顺序并附加它们,或者更准确地说,您希望将第二个列表附加到第一个列表中,下面是prolog规则

append(List,[],List).
append(List,[Head|Tail],[Head|Res]):-append(List,Tail,Res).
第一条规则是,当第二个列表为空时,将第一个列表附加到结果中


第二条规则是,将第二个列表的头添加到结果中,然后递归地将第二个列表的尾添加到第一个列表中。

我不清楚问题陈述。如果你想要的是

revappend( [1,2] , [3,4] , L ) .
生产,如您的示例所示:

L = [3,4,1,2]
解决方案很简单:

revappend( Xs , Ys , Zs ) :- append(Ys,Xs,Zs) .
如果不想或无法使用内置的
append/3
,可以执行以下操作:

revappend( [] , [] , [] ) .
revappend( Xs , [Y|Ys] , [Y|Zs] ) :- revappend( Xs , Ys , Zs ) .
revappend( [X|Xs] , [] , [X|Zs] ) :- revappend( Xs , [] , Zs ) .
然而,当我听到你的问题陈述时,尽管:

我试图颠倒列表的顺序并附加它们

我希望你的

revappend( [1,2] , [3,4] , L ) .
将产生
L=[2,1,4,3]
L=[4,3,2,1]

对于前一种(
[2,1,4,3]
)情况,您可以编写如下内容:

revappend( Xs, Yz , Zs ) :- revappend(Xs,Yz,[],Zs) .

revappend( []     , []     , Zs , Zs ) .
revappend( [X|Xs] , Ys     , Rs , Zs ) :- revappend(Xs,Ys,[X|Rs],Zs).
revappend( []     , [Y|Ys] , Rs , Zs ) :- revappend([],Ys,[Y|Rs],Zs).
对于后者(
[4,3,2,1]
),您只需稍微修改一下,按照以下内容修改
revappend/4

revappend( []     , []     , Zs , Zs ) .
revappend( Xs     , [Y|Ys] , Rs , Zs ) :- revappend(Xs,Ys,[Y|Rs],Zs).
revappend( [X|Xs] , []     , Rs , Zs ) :- revappend(Xs,[],[X|Rs],Zs).
请注意,您也可以使用内置程序执行此操作:

revappend(Xs,Ys,Zs) :-
  reverse(Xs,X1) ,
  reverse(Ys,Y1) ,
  append(X1,Y1,Zs)
  .

问题陈述对我来说不清楚。如果你想要的是

revappend( [1,2] , [3,4] , L ) .
生产,如您的示例所示:

L = [3,4,1,2]
解决方案很简单:

revappend( Xs , Ys , Zs ) :- append(Ys,Xs,Zs) .
如果不想或无法使用内置的
append/3
,可以执行以下操作:

revappend( [] , [] , [] ) .
revappend( Xs , [Y|Ys] , [Y|Zs] ) :- revappend( Xs , Ys , Zs ) .
revappend( [X|Xs] , [] , [X|Zs] ) :- revappend( Xs , [] , Zs ) .
然而,当我听到你的问题陈述时,尽管:

我试图颠倒列表的顺序并附加它们

我希望你的

revappend( [1,2] , [3,4] , L ) .
将产生
L=[2,1,4,3]
L=[4,3,2,1]

对于前一种(
[2,1,4,3]
)情况,您可以编写如下内容:

revappend( Xs, Yz , Zs ) :- revappend(Xs,Yz,[],Zs) .

revappend( []     , []     , Zs , Zs ) .
revappend( [X|Xs] , Ys     , Rs , Zs ) :- revappend(Xs,Ys,[X|Rs],Zs).
revappend( []     , [Y|Ys] , Rs , Zs ) :- revappend([],Ys,[Y|Rs],Zs).
对于后者(
[4,3,2,1]
),您只需稍微修改一下,按照以下内容修改
revappend/4

revappend( []     , []     , Zs , Zs ) .
revappend( Xs     , [Y|Ys] , Rs , Zs ) :- revappend(Xs,Ys,[Y|Rs],Zs).
revappend( [X|Xs] , []     , Rs , Zs ) :- revappend(Xs,[],[X|Rs],Zs).
请注意,您也可以使用内置程序执行此操作:

revappend(Xs,Ys,Zs) :-
  reverse(Xs,X1) ,
  reverse(Ys,Y1) ,
  append(X1,Y1,Zs)
  .

revappend(A,B,C)有什么问题?:-append(B,A,C)。
?而对于你的“给我的结果像…”你没有说输入是什么。所以这有点不清楚。
revappend(a,B,C):-append(B,a,C)有什么问题。
?而对于你的“给我的结果像…”你没有说输入是什么。所以这有点不清楚。revappend([X | Xs],[X | Zs]):-revappend(Xs,[],Zs)。这条规则我不太清楚。我认为这个规则解释了如果第二个列表是空的,那么,将第二个列表附加到第一个列表,并得到第一个列表的结果,因为我只是一个新的学习者,所以我使用事实来解释它:revappend([X | Xs],],[X | Xs])。我错了吗?revappend([X | Xs],[X | Zs]):-revappend(Xs,[],Zs)。这条规则我不太清楚。我认为这个规则解释了如果第二个列表是空的,那么,将第二个列表附加到第一个列表,并得到第一个列表的结果,因为我只是一个新的学习者,所以我使用事实来解释它:revappend([X | Xs],],[X | Xs])。我错了吗?