在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