在Prolog中列出less

在Prolog中列出less,prolog,Prolog,我想为两个列表list\u less(L1,L2)编写一个谓词,如果列表L1小于列表L2的顺序如下: list_less(L1, L2) iff Let L1' := complement(L1,L2), L2' := complement(L2,L1) (complement(L1,L2) contains those elements of L1 that are not in L2) Let m1 := max(L1'), m2 := max(L2')

我想为两个列表
list\u less(L1,L2)
编写一个谓词,如果列表
L1
小于列表
L2
的顺序如下:

list_less(L1, L2) iff  
 Let L1' := complement(L1,L2), L2' := complement(L2,L1)  
  (complement(L1,L2) contains those elements of L1  
   that are not in L2)  
 Let m1 := max(L1'), m2 := max(L2')  
  (max(L) gives the maximal element of L with respect to  
   the standard order @<)  
 m1 @< m2.  
我从这个开始:

list_less([],[]).
list_less([H|T],[X|Y]):-
    complement([H|T],[X|Y],L),
    max_list(H|T],M1).

complement([],[],[]). 
complement([H|T],[X|Y],L):-
    member(H,[X|Y]),
    !,
    complement(T,Y,[X|_]).

max_list(L, Max):-
    select(Max, L, Rest),
    \+ (member(E, Rest), E > Max).

这里有一个更紧凑的解决方案(比首先计算差异列表的解决方案)

list_less([],[]).
list_less([H|T],[X|Y]):-
    complement([H|T],[X|Y],L),
    max_list(H|T],M1).

complement([],[],[]). 
complement([H|T],[X|Y],L):-
    member(H,[X|Y]),
    !,
    complement(T,Y,[X|_]).

max_list(L, Max):-
    select(Max, L, Rest),
    \+ (member(E, Rest), E > Max).
list_less(As, Bs):-
    sort(As, SortedAs),
    reverse(SortedAs, RevAs),
    sort(Bs, SortedBs),
    reverse(SortedBs, RevBs),
    RevAs @< RevBs.
| ?- list_less([3,3,3,3,2,2],[3,3,4,0]).

(4 ms) yes
| ?- list_less([a,b,X,Y,[X|Y],2], [[X,X|Y]]).

yes
| ?- list_less([a,b,X,Y,[X|Y],2], [X,b,b]).

no