我有一个List
,我正尝试从另一个列表中添加第一个present
中尚未List
的元素。
所以,如果我有2个列表:
[a, b, 3, c]
[2, a, b, 4]
输出为:
[a, b, 3, c, 2, 4]
我能够以相反的顺序获取它,但不能以正确的顺序获取,这是我要尝试的操作:
add_to_list(L, [], L).
add_to_list(List, [H|T], [H|Res]) :-
\+ member(H, List),
add_to_list(List, T, Res).
add_to_list(List, [H|T], Res):-
add_to_list(List, T, Res).
当我对上面提到的2个列表进行处理时,我得到的输出是:
[2, 4, a, b, 3, c]
我知道我的ending子句将L
添加到得到的结果的末尾,这就是为什么顺序混乱的原因,但是我该如何正确执行呢?
答案 0 :(得分:1)
这里的问题是,在连接数据之前,您应该首先移至第一个列表的 end 。
我们仍然可以使用您编写的代码,但是请稍作更改:
atl(_, [], []).
atl(List, [H|T], R) :-
( member(H, List)
-> R = Res
; R = [H|Res]
),
atl(List, T, Res).
我们在这里基本上进行了三处更改:(a)将addToList/3
重命名为atl/3
;我们在第一行中将L
更改为[]
; (c)我们使用了if-then-else来防止第三子句被触发,即使H
不是List
的成员(这是代码中的语义错误)。>
现在,我们将获得给定输入作为输出:
?- atl([a, b, 3, c] , [2, a, b, 4], R).
R = [2, 4] ;
false.
因此,现在我们可以用addToList/3
来写atl/3
:我们首先生成要附加的项目列表,然后我们使用append/3
在项目末尾附加这些项目列表:
addToList(A, B, L) :-
atl(A, B, R),
append(A, R, L).