Prolog 为什么结果列表的结尾不是[]?

Prolog 为什么结果列表的结尾不是[]?,prolog,Prolog,我试图输出一个只包含唯一元素的列表。但结果并不完美 例如: ?-toset([1,1,2,3],X)。 结果应该是'X=[1,2,3]',但现在是'X=[1,2,3|u 16998]' 实际上,您以错误的方式实现了toset/2。实际上,您可以在此处使用list\u member/2将元素添加到列表中。事实上,如果使用自由变量,则会得到: ?- list_member(2, L). L = [2|_3616] ; L = [_3614, 2|_3622]. 列表_成员/2本身也没有正确实现。此

我试图输出一个只包含唯一元素的列表。但结果并不完美

例如:
?-toset([1,1,2,3],X)。

结果应该是
'X=[1,2,3]'
,但现在是
'X=[1,2,3|u 16998]'


实际上,您以错误的方式实现了
toset/2
。实际上,您可以在此处使用
list\u member/2
将元素添加到列表中。事实上,如果使用自由变量,则会得到:

?- list_member(2, L).
L = [2|_3616] ;
L = [_3614, 2|_3622].
列表_成员/2
本身也没有正确实现。此处的切割(
)防止保持屈服值。因此,您应该删除切口:

list_member(X, [X|_]).
list_member(X, [_|Tail]) :-
    list_member(X,Tail).
因此,这可以产生
2
为成员的所有可能列表:

?- list_member(2, L).
L = [2|_3412] ;
L = [_3410, 2|_3418] ;
L = [_3410, _3416, 2|_3424] ;
L = [_3410, _3416, _3422, 2|_3430] ;
...
但现在问题仍然存在:您不应该在此处使用
list\u member/2
向列表添加元素,您可以在此处使用累加器跟踪已生成的元素,然后最终返回累加器,如:

toset(L, S) :-
    toset(L, [], S).
toset([], A, S):-
    reverse(A, S).
toset([H|T], A, L) :-
    (  member_list(H, A)
    -> toset(T, [H|A], L)
    ;  toset(T, A, L)
    ).
toset(长、短):-
toset(L,[],S)。
toset([],A,S):-
反向(A,S)。
toset([H | T],A,L):-
(成员名单(H,A)
->toset(T[H | A],L)
;toset(T,A,L)
).
因此,我们不断地将值前置到累加器,最后,我们调用累加器,并返回结果。

toset([],uu>)
-将空列表转换为一组唯一元素的结果可以是任何值?
toset(L, S) :-
    toset(L, [], S).
toset([], A, S):-
    reverse(A, S).
toset([H|T], A, L) :-
    (  member_list(H, A)
    -> toset(T, [H|A], L)
    ;  toset(T, A, L)
    ).