如何在不使用prolog中的append()方法的情况下将列表附加到另一个列表?

时间:2018-05-03 06:27:39

标签: list prolog

我试图将list1追加到list2而不使用prolog中的append方法。我在谷歌搜索过它,但我找不到任何解决办法。有可能吗?我亲自尝试过,但我无法做到。这就是我正在做的......

apnd(X,[],X). //Stop condition when second list is empty loop will be stopped.
apnd(X,[H|T],R):-//now here i have to append H to X but for this i have to use append method. i don't want to use this. 
//After this i will remove H from second list and loop again for remaining list.

如果没有append()方法可以做到这一点我怎么能这样做?

更新

不使用append()方法的原因

我是工科学生,我在过去几年的问题论文中提到我的考试准备,并且他们已经提出了这个问题。在读完这个问题之后,我很想知道这是真的可能吗?如果是,那怎么样?所以,我在这里提出这个问题是因为我没有从我的任何书籍或谷歌中找到解决方案或任何提示。

1 个答案:

答案 0 :(得分:3)

有几篇帖子展示了如何在SO上编写这样的谓词。例如hereherehere或......

或者,由于您正在描述列表,您还可以选择使用DCG执行此任务,例如:

list_list_appended(L1,L2,AL) :-  % the appended list
   phrase(appended(L1,L2),AL).   % is described by the DCG appended//2

appended([],[]) -->              % if the two lists are empty
   [].                           % so is the appended list
appended([X|Xs],L) -->           % if the first list starts with X
   [X],                          % X is in the appended list
   appended(Xs,L).               % the same for the tail and the 2nd list
appended([],[X|Xs]) -->          % if the first list is empty but the 2nd isn't
   appended([X|Xs],[]).          % the appended list is the empty list
                                 % appended to the first list

查询此谓词会产生所需的结果:

?- list_list_appended([1,2,3],[a,b],AL).
AL = [1, 2, 3, a, b] ;
false.

您可以使用listing/1查看DCG如何转换为谓词,从而为您提供另一个版本:

?- listing(appended).
appended([], [], A, A).
appended([A|B], C, [A|D], E) :-
        appended(B, C, D, E).
appended([], [A|B], C, D) :-
        appended([A|B], [], C, D).

true.

请注意,您也可以在其他方向使用谓词,例如附加后哪两个列表会产生[1,2,3,a,b,c]

?- list_list_appended(L1,L2,[1,2,3,a,b,c]).
L1 = [1, 2, 3, a, b, c],
L2 = [] ;
L1 = [1, 2, 3, a, b],
L2 = [c] ;
L1 = [1, 2, 3, a],
L2 = [b, c] ;
L1 = [1, 2, 3],
L2 = [a, b, c] ;
L1 = [1, 2],
L2 = [3, a, b, c] ; 
L1 = [1],
L2 = [2, 3, a, b, c] ;
L1 = [],
L2 = [1, 2, 3, a, b, c] ;
false.