Remove duplicates in list (Prolog)

后端 未结 9 2195
鱼传尺愫
鱼传尺愫 2020-11-27 08:02

I am completely new to Prolog and trying some exercises. One of them is:

Write a predicate set(InList,OutList) which takes as input an arbitrary l

9条回答
  •  挽巷
    挽巷 (楼主)
    2020-11-27 08:16

    Using the support function mymember of Tim, you can do this if the order of elements in the set isn't important:

    mymember(X,[X|_]).
    mymember(X,[_|T]) :- mymember(X,T).
    
    mkset([],[]).
    mkset([T|C], S) :- mymember(T,C),!, mkset(C,S).
    mkset([T|C], S) :- mkset(C,Z), S=[T|Z].
    

    So, for example ?- mkset([1,4,1,1,3,4],S) give you as output:

    S = [1, 3, 4]
    

    but, if you want a set with the elements ordered like in the list you can use:

    mkset2([],[], _).
    mkset2([T|C], S, D) :- mkset2(C,Z,[T|D]), ((mymember(T,D), S=Z,!) ; S=[T|Z]).
    mkset(L, S) :- mkset2(L,S,[]).
    

    This solution, with the same input of the previous example, give to you:

    S = [1, 4, 3]
    

    This time the elements are in the same order as they appear in the input list.

提交回复
热议问题