home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lifeos2.zip / LIFE-1.02 / TESTS / LF / BOITES2.LF < prev    next >
Text File  |  1996-06-04  |  3KB  |  101 lines

  1. % FILE. . . . . /_/udir4/_/bonnet/life/boites.lf
  2. % EDIT BY . . . Christophe Bonnet
  3. % ON MACHINE. . Prl303
  4. % STARTED ON. . Tue Jul 21 19:00:36 1992
  5.  
  6.  
  7. ::box(int,int).
  8.  
  9. %box represente une boite, le premier argument etant le numero de la boite, et 
  10. %le deuxieme le nombre de billes contenues dans la boite.
  11. %
  12. %L'ordre sur les boites correspond a l'ordre de leur numero.
  13.  
  14. box_less(box(A,@),box(B,@)) :- A  < B.
  15. box_less(box,box) :- ! ,fail.
  16. box_less(bxa,bxa) :- ! ,fail.
  17. box_less(bxa,@).
  18. %On a une configuration de depart :
  19.  
  20. init_bx([bxa,box(3,2),box(6,1)|L1:[box(7,9),box(11,4)|L2:[box(18,6),box(34,65)]]],
  21.     [L1,L2]).
  22.  
  23. %Le deuxieme argument est une liste de "pointeurs" vers la place de certaines
  24. %boites, que je veux pouvoir supprimer de la configuration en un temps
  25. %constant, quelques soient les operations effectuees entre temps. Pour cela, on
  26. %utilisera le predicat "del" :
  27.  
  28. del(L:[@|Tl]) :- L <- Tl.
  29.  
  30. %Les operations que l'on s'autorise a effectuer sur la configuration de depart
  31. %sont des ajouts ou retraits de billes dans les boites, operations que l'on
  32. %represente par des listes (triees) de boites.
  33.  
  34. exemple -> [bxa,box(3,-1),box(4,5),box(11,-2),box(18,3)].
  35.  
  36. %le "merge" de deux listes de boites correspond a la combinaison de deux
  37. %operations, ou (ce qui revient au meme, ou presque) a l'application d'une
  38. %operation a la combinaison initiale. Il va de soit que l'on souhaite preserver
  39. %la validite' des coreferences crees par init_bx...
  40.  
  41.  
  42. %solution actuelle :
  43.  
  44.  
  45. merge([],@).
  46. merge(L1,[@|L2:[]]) :- L2 <- L1.
  47. merge([A|L1],LP:[U|L2:[B|@]]) :- box_less(A,B),
  48.                 LP <- [U|L3:[A|L2]],
  49.                 merge(L1,L3).
  50. merge(L1:[A|@],[@|L2:[B|@]]) :- box_less(B,A),
  51.                 merge(L1,L2).
  52. merge([box(Id,A)|L1],[@|L2:[box(Id,B)|@]]) :- B <- A+B,
  53.                         merge(L1,L2).
  54. merge([bxa|L1],L2) :- merge(L1,L2).
  55.  
  56.  
  57.  
  58.  
  59. %voir fichier boites.sample
  60.  
  61.  
  62. %exemples utilises dans boites.in/boites.out :
  63.  
  64. init2([bxa|D1:[box(1,4)|D2:[box(3,5)|D3:[box(5,1)]]]],[D1,D2,D3]).
  65.  
  66. action_list -> [[bxa,box(1,-3),box(2,5),box(3,-2)],
  67.         [bxa,box(0,4),box(1,1)],
  68.         [bxa,box(3,2),box(6,2)]].
  69.  
  70. erase(L,[D|Tl]) :- !,del(D),nl,write(L),erase(L,Tl).
  71.  
  72. loop(L,DL,[]) :- nl.
  73. loop(L,DL,[A|@]) :- nl,write(L),
  74.         nl,write(A),
  75.         nl,merge(A,[@|L]),write(L),
  76.         nl,erase(L,DL).
  77. loop(L,DL,[@|AL]) :- nl,loop(L,DL,AL).
  78.  
  79. main1 :- init2(L,DL),loop(L,DL,action_list).
  80.  
  81.  
  82. % solution permettant, le cas echeant, de ne pas avoir les bxa en
  83. %tete de liste :
  84. merge2([A|L1],L2:[B|@],L3:[A|L2]) :- box_less(A,B), !,
  85.                 merge(L1,L3).
  86. merge2(L1,L2,L2) :- merge(L1,[bxa|L2]).
  87.  
  88. init22(D1:[box(1,4)|D2:[box(3,5)|D3:[box(5,1)]]],[D1,D2,D3]).
  89. loop2(L,DL,[]) :- nl.
  90. loop2(L1,DL,[A|@]) :- nl,write(L1),
  91.         nl,write(A),
  92.         nl,merge2(A,L1,L2),write(L2),
  93.         nl,erase(L2,DL).
  94. loop2(L,DL,[@|AL]) :- nl,loop2(L,DL,AL).
  95.  
  96. main2 :- init22(L,DL),loop2(L,DL,action_list2).
  97.  
  98. action_list2 -> [[box(1,-3),box(2,5),box(3,-2)],
  99.         [box(0,4),box(1,1)],
  100.         [box(3,2),box(6,2)]].
  101.