将非重复元素添加到Prolog中的列表

时间:2018-10-21 21:25:16

标签: list prolog

我有一个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添加到得到的结果的末尾,这就是为什么顺序混乱的原因,但是我该如何正确执行呢?

1 个答案:

答案 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).