home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / b / binprolog / !BinPro330 / progs / cube < prev    next >
Encoding:
Text File  |  1994-02-11  |  2.1 KB  |  82 lines

  1. /*----------------------------------------------------------------------------
  2. Program:  Instant Insanity (fused gen & test)
  3. Author:   E. Tick
  4. Date:     August 26 1989
  5.  
  6. Notes:
  7. 1. To run:
  8.     ?- go(7,N,T,S).
  9. where output S is the list of solutions, N=48 the number of solutions
  10. (for 7-cubes), and T is the execution time.
  11. --------------------------------------------------------------------
  12. :- sequential.
  13. :- parallel set/2, rotate/3.
  14. */
  15. p:-[cube].
  16.  
  17. go:-go('BMARK_cube:').
  18.  
  19. go(Mes):-go(7,N,T,_S),write(Mes=[sols=N,time=T]),nl.
  20.  
  21. go(C,N,T,S) :- time(_),
  22.     findall(X,sol(C,X),S), count(S,N), 
  23.     time(T).
  24.  
  25. sol(C,X) :- cubes(C,Q), sol(Q,[],X).
  26.  
  27. sol([],A,A).
  28. sol([Q|Qs],A,F) :-
  29.     set_cube(Q,P),
  30.     check(A,P),
  31.     sol(Qs,[P|A],F).
  32.  
  33. check([],_).
  34. check([q(A1,B1,C1,D1)|As],P) :-
  35.     P = q(A2,B2,C2,D2),
  36.     A1 =\= A2, B1 =\= B2, C1 =\= C2, D1 =\= D2, 
  37.     check(As,P).
  38.  
  39. set_cube(q(P1,P2,P3),P) :- rotate(P1,P2,P).
  40. set_cube(q(P1,P2,P3),P) :- rotate(P2,P1,P).
  41. set_cube(q(P1,P2,P3),P) :- rotate(P1,P3,P).
  42. set_cube(q(P1,P2,P3),P) :- rotate(P3,P1,P).
  43. set_cube(q(P1,P2,P3),P) :- rotate(P2,P3,P).
  44. set_cube(q(P1,P2,P3),P) :- rotate(P3,P2,P).
  45.  
  46. rotate(p(C1,C2),p(C3,C4),q(C1,C2,C3,C4)).
  47. rotate(p(C1,C2),p(C3,C4),q(C1,C2,C4,C3)).
  48. rotate(p(C1,C2),p(C3,C4),q(C2,C1,C3,C4)).
  49. rotate(p(C1,C2),p(C3,C4),q(C2,C1,C4,C3)).
  50.  
  51. cubes(4,[q(p(0,1),p(2,0),p(1,3)),
  52.          q(p(3,3),p(2,0),p(1,2)),
  53.          q(p(0,3),p(3,1),p(1,2)),
  54.          q(p(0,0),p(3,0),p(1,2))]).
  55. cubes(5,[q(p(2,1),p(1,4),p(3,1)),
  56.          q(p(3,2),p(2,0),p(3,4)),
  57.          q(p(1,4),p(3,1),p(0,4)),
  58.          q(p(1,0),p(2,2),p(0,4)),
  59.          q(p(4,2),p(4,3),p(0,3))]).
  60. cubes(6,[q(p(0,5),p(1,5),p(3,1)),
  61.          q(p(2,1),p(3,4),p(4,0)),
  62.          q(p(3,0),p(4,5),p(2,4)),
  63.          q(p(1,3),p(5,1),p(0,1)),
  64.          q(p(0,2),p(0,2),p(5,2)),
  65.          q(p(4,4),p(2,3),p(4,5))]).
  66. cubes(7,[q(p(5,1),p(0,5),p(3,1)),
  67.          q(p(2,3),p(1,4),p(4,0)),
  68.          q(p(3,6),p(0,0),p(2,4)),
  69.          q(p(6,4),p(6,1),p(0,1)),
  70.          q(p(1,5),p(3,2),p(5,2)),
  71.          q(p(5,0),p(2,3),p(4,5)),
  72.          q(p(4,2),p(2,6),p(0,3))]).
  73.  
  74. time(T) :- statistics(runtime,[_,T]).
  75.  
  76. count(L,N) :- count(L,0,N).
  77. count([],N,N).
  78. count([X|Xs],M,N) :- M1 is M+1, count(Xs,M1,N).
  79.  
  80.  
  81.  
  82.