fork(1) download
  1. :- set_prolog_flag(verbose,silent).
  2. :- prompt(_, '').
  3. :- use_module(library(readutil)).
  4. :- use_module(library(apply)).
  5.  
  6. car([X,_],X).
  7. cdr([_,X],X).
  8.  
  9. move(From1,To1,ResFrom,ResTo):-append(From2,ResFrom,From1),
  10. sort(From2,[X]),
  11. ResFrom=[Y|_],
  12. X\=Y,
  13. member(To1,[[X|_],[]]),
  14. !,
  15. append(From2,To1,ResTo),!,
  16. length(ResTo,Len),
  17. Len<5.
  18.  
  19. move(From1,To1,[],ResTo):-sort(From1,[X]),
  20. member(To1,[[X|_],[]]),!,
  21. append(From1,To1,ResTo),!,
  22. length(ResTo,Len),
  23. Len<5.
  24.  
  25.  
  26. get_next([Next1,_],Next):-maplist(car,Next1,Next2),msort(Next2,Next).
  27. is_next_big(E1,Next1):-get_next(Next1,Next2),sort([E1,Next2],[E1,Next2]).
  28. is_next_equal(E1,Next1):-get_next(Next1,Next2),sort([E1,Next2],[E1]).
  29.  
  30.  
  31. deduplication([],[],[],[]):-!.
  32. deduplication([],[E1|Data],[E1|ResData],[E2|ResMemo]):-!,
  33. get_next(E1,E2),
  34. deduplication([],Data,ResData,ResMemo).
  35. deduplication(Memo,[],[],Memo):-!.
  36. deduplication([E1|Memo],[E2|Data],ResData,ResMemo):-is_next_equal(E1,E2),
  37. !,
  38. deduplication([E1|Memo],Data,ResData,ResMemo).
  39. deduplication([E1|Memo],[E2|Data],ResData,ResMemo):-is_next_big(E1,E2),
  40. !,
  41. deduplication(Memo,[E2|Data],ResData,ResMemo).
  42. deduplication([E1|Memo],[E2|Data],[E2|ResData],[E3|ResMemo]):-!,
  43. get_next(E2,E3),
  44. deduplication([E1|Memo],Data,ResData,ResMemo).
  45.  
  46. main:-
  47. process,
  48.  
  49. process:-
  50. /* your code goes here */
  51. Test=[[[[3,1,1,2],1],[[2,4,4,2],2],[[1,4,2,4],3],[[3,1,3,3],4],[[],5],[[],6]],[]],
  52. get_next(Test,Test2),
  53. write(Test2),
  54.  
  55. :- main.
Success #stdin #stdout 0.04s 6300KB
stdin
Standard input is empty
stdout
[[],[],[1,4,2,4],[2,4,4,2],[3,1,1,2],[3,1,3,3]]