Prolog附加两个谓词的结果

时间:2014-12-14 04:52:58

标签: prolog append

:- import append/3 from basics.


    help1(0,L,[]).
    help1(_,[],[]).
    help1(N,[X|Xs],[X|Res]):- N2 is N - 1, help1(N2,Xs,Res).

    help2(0,L,L).
    help2(N,[X|Xs],Res):- N2 is N - 1, help2(N2,Xs,Res).


    help3(N,L,R):- help1(N,L,R) append help2(N,L,R).

在下面的代码中,我的help1谓词将把前N个值存储在列表中。 我的help2谓词将存储列表中前N个值之后的所有值。

最后在我的help3函数中,我试图追加我从help1和help2获得的结果。但我无法这样做。任何人都可以帮助我或指出我做了什么错误吗?

1 个答案:

答案 0 :(得分:2)

首先,help1的定义过于笼统:

?- help1(3,[a,b,c,d,e],Xs).
  Xs = [a,b,c]                   % expected result
; Xs = [a,b,c,d,e]               % WRONG!
; false.

这可以通过删除谓词定义中的第二个子句来解决:

help1(0,_ ,[]).
help1(_,[],[]) :- false.         % too general
help1(N,[X|Xs],[X|Res]) :- 
   N2 is N-1,
   help1(N2,Xs,Res).

要连接两个列表,请使用append/3。照顾参数顺序!

help3(N,L,R) :-
   help1(N,L,R1),
   help2(N,L,R2),
   append(R2,R1,R).

完成!我们来试试吧:

?- help3(2,[a,b,c,d,e,f],R).
  R = [c,d,e,f,a,b]              % OK! works as expected
; false.

还有一件事......实际上你不需要定义辅助谓词help1help2

只需使用append/3length/2,就像这样:

help3(N,L,R) :-
   length(Prefix,N),
   append(Prefix,Suffix,L),
   append(Suffix,Prefix,R).

样品使用:

?- help3(2,[a,b,c,d,e,f],R).
R = [c,d,e,f,a,b].