:- 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获得的结果。但我无法这样做。任何人都可以帮助我或指出我做了什么错误吗?
答案 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.
还有一件事......实际上你不需要定义辅助谓词help1
和help2
。
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].