Advertisement
Guest User

Untitled

a guest
Dec 12th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.53 KB | None | 0 0
  1. %lab 11
  2. move((K,M),[N|Ns],[N|Ns1]):-K>1,K1 is K-1,move((K1,M),Ns,Ns1).
  3. move((1,N),[N|Ns],Ns).
  4. move((1,M),[N|Ns],[N1|Ns]):-M<N,N1 is N-M.
  5.  
  6.  
  7. initialize(nim,[1,3,5,7],opponent).
  8.  
  9. play(Game,Result) :-initialize(Game,Position,Player),display_game(Position,Player),
  10. play(Position,Player,Result).
  11. play(Position,Player,Result) :-game_over(Position,Player,Result), !,announce(Result).
  12. play(Position,Player,Result) :-choose_move(Position,Player,Move),move(Move,Position,Position1),display_game(Position1,Player),next_player(Player,Player1),!, play(Position1,Player1,Result).
  13.  
  14. choose_move(Position,opponent,Move) :-write(['Please make move (pile,matches)']), nl,read(Move),legal(Move,Position).
  15. choose_move(Ns,computer,Move):-unsafe(Ns,Sum),safe_move(Ns,Sum,Move).
  16. choose_move(Ns,computer,(1,1)):-safe(Ns).
  17.  
  18. nim_sum([N|Ns],Bs,Sum) :-binary(N,Ds),nim_add(Ds,Bs,Bs1),nim_sum(Ns,Bs1,Sum).
  19.  
  20. safe_move(Piles,NimSum,Move) :-safe_move(Piles,NimSum,1,Move).
  21. safe_move([Pile|_],NimSum,K,(K,M)) :-binary(Pile,Bs),can_zero(Bs,NimSum,Ds,0),
  22. decimal(Ds,M).
  23. safe_move([_|Piles],NimSum,K,Move) :-K1 is K+1,safe_move(Piles,NimSum,K1,Move).
  24.  
  25. can_zero([],NimSum,[],0) :-zero(NimSum).
  26. can_zero([_|Bs],[0|NimSum],[C|Ds],C) :-can_zero(Bs,NimSum,Ds,C).
  27. can_zero([B|Bs],[1|NimSum],[D|Ds],C) :-D is 1-B*C, C1 is 1-B, can_zero(Bs,NimSum,Ds,C1).
  28. decimal(0,'0').
  29. decimal(1,'1').
  30. decimal(N,B) :-
  31. N > 1,
  32. X is N mod 2,
  33. Y is N//2,
  34. decimal(Y,B1),
  35. atom_concat(B1, X, B).
  36.  
  37. next_player(opponent,computer).
  38. next_player(computer,opponent).
  39.  
  40. display_game(Position,Player):-write(Player),write(''),write(Position),nl.
  41.  
  42. game_over([],_,_).
  43. announce(result):-write('Game over:').
  44. legal((N,M),Position):-nth1(N,Position,Pile),Pile>=M,M>0.
  45. unsafe(Ns,Sum):-nim_sum(Ns,Sum,S),zero(S).
  46. safe(Ns):-not(unsafe(Ns,_)).
  47. nim_sum([N|Ns],Bs,Sum):-binary(N,Ds),nim_add(Ds,Bs,Bs1),nim_sum(Ns,Bs1,Sum).
  48. zero([]).
  49. zero([X|NimSum]):-X=:=0,zero(NimSum).
  50.  
  51. suma(0,0,0).
  52. suma(1,1,0).
  53. suma(1,0,1).
  54. suma(0,1,1).
  55.  
  56. nim_add([],[],[]).
  57. nim_add([X|Ns],[Y|Bs],[S|Bs1]):-suma(X,Y,S),nim_add(Ns,Bs,Bs1).
  58.  
  59. bin(0,[]).
  60. bin(N,[M|R]):-M is Nmod2,C is N // 2,(C,M)/=(0,0),bin(C,R).
  61.  
  62. binary(N,D):-bin(N,D).
  63. pow(A,N,R):-R is A**N.
  64.  
  65. decimal([],0).
  66. decimal(L,X):-deci(L,X,0,0).
  67.  
  68. deci([],X,X,_).
  69. deci([H|T],X,Xi,N):-pow(2,N,S),S1 is H*S+Xi,N1 is N+1,deci(T,X,S1,N1).
  70.  
  71.  
  72.  
  73. decimal(0,'0').
  74. decimal(1,'1').
  75. decimal(N,B) :-
  76. N > 1,
  77. X is N mod 2,
  78. Y is N//2,
  79. decimal(Y,B1),
  80. atom_concat(B1, X, B).
  81.  
  82. next_player(opponent, computer).
  83. next_player(computer, opponent).
  84.  
  85. display_game(Position, Player):-
  86. write(Player),
  87. write(''),
  88. write(Position),
  89. nl.
  90.  
  91. game_over([],_,_).
  92.  
  93. announce(result):- write('Game over').
  94.  
  95. safe(Ns):-not(unsafe(Ns,_)).
  96. unsafe(Ns,Sum):-nim_sum(Ns, Sum, S), zero(S).
  97.  
  98. legal((N,M),Position):-nth1(N, Position, Pile), Pile >= M, M > 0.
  99.  
  100.  
  101. zero([]).
  102. zero([X|NimSum]):-X=:=0,zero(NimSum).
  103.  
  104. sum(0,0,0).
  105. sum(1,1,1).
  106. sum(1,0,1).
  107. sum(0,1,1).
  108.  
  109. nim_add([], [], []).
  110. nim_add([X|Ns], [Y|Bs], [S|Bs1]):-
  111. sum(X,Y,S),
  112. nim_add(Ns,Bs,Bs1).
  113.  
  114. bin(0,[]).
  115. bin(N,[M|R]):-M is N mod 2, C is N//2, (C,M) \= (0,0), bin(C,R).
  116. binary(N,D):-bin(N, D).
  117.  
  118. pow(A,N,R):-R is A**N.
  119.  
  120.  
  121.  
  122.  
  123. %lab10
  124.  
  125.  
  126. start:- write('Input the formula (ex: [p, and, [not, q]]) ='),
  127. read(Formula), write('Input the variables list'), read(Var),
  128. table(Formula, Var).
  129.  
  130. liste_variables([p,q,r,s,t,u,v,z]).
  131. bienforme(X):-liste_variables(L),member(X,L).
  132. bienforme([not,F]):-bienforme(F).
  133. bienforme([X,O,Y]):-bienforme(X),
  134. member(O,[and,or,->,<->]),
  135. bienforme(Y).
  136.  
  137. combiner(L,0,[[]]):-!.
  138. combiner(L,N,R):-N1 is N-1,combiner(L,N1,R1),ajouter(L,R1,R).
  139. ajouter(_,[],[]).
  140. ajouter([],_,[]).
  141.  
  142. ajouter([H|T],[H1|T1],[[H|H1]|R]):-
  143. ajouter([H],T1,R1),ajouter(T,[H1|T1],R2),append(R1,R2,R).
  144.  
  145. subst(N,V,[],[]).
  146. subst(N,V,[V|T],[N|R]):-subst(N,V,T,R).
  147. subst(N,V,[A|T],[A|R]):-A\=V,atom(A),subst(N,V,T,R).
  148. subst(N,V,[A|T],[R1|R]):-A\=V,not(atom(A)),subst(N,V,A,R1),subst(N,V,T,R).
  149.  
  150. sub([],[],L,L).
  151. sub([Val|T1],[Var,T2],F,R):-
  152. subst(Val,Var,F,S),sub(T1,T2,S,R).
  153.  
  154. table(Formula, Lvar):- length(Lvar, Lung),
  155. combiner([true, false], Lung, Comb),
  156. member(C, Comb),
  157. line(C, Lvar, Formula, Rez), fail.
  158. line(C, Lvar, Formula, Rez):- write(C), tab(2),
  159. sub(C, Lvar, Formula, Rez),
  160. write(Rez), tab(3),
  161. (eval(Rez), write(true), !; write(false), !), nl.
  162. eval(true):- true.
  163. eval(false):- false.
  164. eval([X, and, Y]):-eval(X), eval(Y).
  165. eval([X, or, Y]):- eval(X); eval(Y).
  166. eval([not, X]):- not(eval(X)).
  167. eval([X, ->, Y]):- not(eval(X)); eval(Y).
  168. eval([X, <->, Y]):- (not(eval(X)); eval(Y)),(not(eval(Y)); eval(X)).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement