Advertisement
Guest User

Prolog Chess AI

a guest
Feb 26th, 2021
530
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 17.58 KB | None | 0 0
  1. :- module(nakamura,[nakamura/2]).
  2.  
  3. :- use_module(brett).
  4. :- use_module(zuege).
  5.  
  6. nakamura(Farbe,Zug) :-
  7.     stein(Farbe,Stein),
  8.     findall((Linie,Reihe,Color,Klotz),brett(Linie,Reihe,Color,Klotz),Board),
  9.     nl,write('Start'),nl,
  10.     alphabeta(Stein,Stein,-10000,10000,Board,(_,_,VonL,VonR,NachL,NachR,_,_),_,0),
  11.     write('Ende!'),nl,
  12.     atomic_list_concat([VonL,VonR,NachL,NachR],Zug),!.
  13.  
  14. stein(weiss,w).
  15. stein(schwarz,s).
  16.  
  17. wert(f,0).
  18. wert(b,10).
  19. wert(s,30).
  20. wert(l,30).
  21. wert(t,50).
  22. wert(k,2000).
  23.  
  24.  
  25. %Evaluation des Brettes und der aktuellen Situation
  26. value(Brett,Value,Gegner) :-          %Evaluiert das Brett aus Sicht des Spielers
  27.     gegner(Gegner,Player),
  28.     findall((Player,Figur,VonL,VonR,NachL,NachR,Gegner1,Brett),zugbewegung(Player,Figur,VonL,VonR,NachL,NachR,Gegner1,Brett),PlayerMoves),
  29.     findall((Gegner,Figur1,VonL1,VonR1,NachL1,NachR1,Gegner2,Brett),zugbewegung(Gegner,Figur1,VonL1,VonR1,NachL1,NachR1,Gegner2,Brett),GegnerMoves),
  30.     mobilitaet(PlayerMoves,PlayerValue),
  31.     mobilitaet(GegnerMoves,GegnerValue),
  32.     ValueMoves is PlayerValue - GegnerValue,
  33.     wertung(Brett,Player,ValueFigurenPlayer),
  34.     wertung(Brett,Gegner,ValueFigurenGegner),
  35.     ValueFiguren is ValueFigurenPlayer - ValueFigurenGegner,
  36.     Value is ValueFiguren + ValueMoves.
  37.  
  38. mobilitaet(Zuege, MobilitaetWert) :-        %berechnet die Mobilitaetspunkte des Spielers
  39.     length(Zuege, MobilitaetWert).
  40.  
  41. wertung([(_,_,Farbe,Figur)|RestVomBrett],Stein,Value) :-    %berechnet die Punkte aller Figuren des Spielers
  42.     wertung(RestVomBrett,Stein,Value1),
  43.     wert(Figur, Materialwert),
  44.     checkPassendeFarbe(Stein,Farbe,Materialwert,Materialwert1),
  45.     Value is Value1 + Materialwert1.
  46. wertung([],_,0).
  47.  
  48. checkPassendeFarbe(Stein,Farbe,Materialwert,Materialwert1) :-     %Ueberprueft ob die Figur auf dem Brett auch wirklich dem Spieler gehört
  49.     Stein == Farbe,
  50.     Materialwert1 is Materialwert.
  51. checkPassendeFarbe(_,_,_,Materialwert1) :-
  52.     Materialwert1 is 0.
  53.  
  54.  
  55.  
  56. %Alpha Beta Algorithmus mit Pruning
  57. alphabeta(Player,MaxiPlayer,Alpha,Beta,Board,NextMove,Eval,Depth) :-
  58.   Depth<2,
  59.   NewDepth is Depth+1,
  60.   findall((Player,Figur,VonL,VonR,NachL,NachR,Gegner,Board),zugbewegung(Player,Figur,VonL,VonR,NachL,NachR,Gegner,Board),Moves),
  61.   write('All Moves:'),sysoutMoves(Moves),nl,
  62.   bounded_best(Player,MaxiPlayer,Alpha,Beta,Board,Moves,NextMove,Eval,NewDepth),
  63.   write('NextMove: '),write(NextMove),nl,!.
  64.  
  65. alphabeta(Player,_,_,_,Board,_,Eval,_) :-
  66.   value(Board,Eval,Player),!.
  67.  
  68. bounded_best(Player,MaxiPlayer,Alpha,Beta,Board,[(Spieler,Figur,VonL,VonR,NachL,NachR,Gegner,_)|Moves],BestMove,BestEval,Depth) :-
  69.   sysoutMove((Spieler,Figur,VonL,VonR,NachL,NachR,Gegner,_)),
  70.   sysoutMoves(Moves),
  71.   ziehen(Board,(Spieler,Figur,VonL,VonR,NachL,NachR,Gegner,_),NewBoard),
  72.   gegner(Player,NextPlayer),
  73.   alphabeta(NextPlayer,MaxiPlayer,Alpha,Beta,NewBoard,_,Eval,Depth),
  74.   good_enough(Player,MaxiPlayer,Moves,Alpha,Beta,Board,(Spieler,Figur,VonL,VonR,NachL,NachR,Gegner,_),Eval,BestMove,BestEval,Depth).
  75.  
  76. good_enough(_,_,[],_,_,_,_,_,_,_) :- !.
  77.  
  78. good_enough(Player,MaxiPlayer,_,_,Beta,_,Move,Eval,Move,Eval,_) :-
  79.   minimizing(Player,MaxiPlayer), Eval > Beta,!.
  80.  
  81. good_enough(Player,MaxiPlayer,_,Alpha,_,_,Move,Eval,Move,Eval,_) :-
  82.   maximizing(Player,MaxiPlayer), Eval < Alpha,!.
  83.  
  84. good_enough(Player,MaxiPlayer,Moves,Alpha,Beta,Board,Move,Eval,BestMove,BestEval,Depth) :-
  85.   new_bounds(Player,MaxiPlayer,Alpha,Beta,Eval,NewAlpha,NewBeta),
  86.   bounded_best(Player,MaxiPlayer,NewAlpha,NewBeta,Board,Moves,Move1,Eval1,Depth),
  87.   better_of(Player,MaxiPlayer,Move,Eval,Move1,Eval1,BestMove,BestEval).
  88.  
  89. new_bounds(Player,MaxiPlayer,Alpha,Beta,Eval,Eval,Beta) :-
  90.   minimizing(Player,MaxiPlayer), Eval > Alpha,!.
  91.  
  92. new_bounds(Player,MaxiPlayer,Alpha,Beta,Eval,Alpha,Eval) :-
  93.   maximizing(Player,MaxiPlayer), Eval < Beta,!.
  94.  
  95. new_bounds(_,_,Alpha,Beta,_,Alpha,Beta).
  96.  
  97. better_of(Player,MaxiPlayer,Move1,Eval1,_,Eval2,Move1,Eval1) :-
  98.   maximizing(Player,MaxiPlayer),
  99.   Eval1 >= Eval2,!.
  100. better_of(Player,MaxiPlayer,_,Eval1,Move2,Eval2,Move2,Eval2) :-
  101.   maximizing(Player,MaxiPlayer),
  102.   Eval2 >= Eval1,!.
  103.  
  104. better_of(Player,MaxiPlayer,Move1,Eval1,_,Eval2,Move1,Eval1) :-
  105.   minimizing(Player,MaxiPlayer),
  106.   Eval1 =< Eval2,!.
  107. better_of(Player,MaxiPlayer,_,Eval1,Move2,Eval2,Move2,Eval2) :-
  108.   minimizing(Player,MaxiPlayer),
  109.   Eval2 =< Eval1,!.
  110.  
  111. maximizing(Player,MaxiPlayer) :-
  112.   Player == MaxiPlayer.
  113. minimizing(Player,MaxiPlayer) :-
  114.   Player \== MaxiPlayer.
  115.  
  116. sysoutMoves([(Player,Figur,VonL,VonR,NachL,NachR,Gegner,_)|Moves]) :-
  117.   write(Player),write(','),write(Figur),write(','),write(VonL),write(','),write(VonR),write(','),write(NachL),write(','),write(NachR),write(','),write(Gegner),write(' | '),
  118.   sysoutMoves(Moves).
  119. sysoutMoves([]).
  120.  
  121. sysoutMove((Player,Figur,VonL,VonR,NachL,NachR,Gegner,_)) :-
  122.   write('Aktueller Zug: '),write(Player),write(','),write(Figur),write(','),write(VonL),write(','),write(VonR),write(','),write(NachL),write(','),write(NachR),write(','),write(Gegner),nl.
  123.  
  124. zugbewegung(Farbe,Figur,VonLinie,VonReihe,NachLinie,NachReihe,Color,Brett) :-
  125.     member((VonLinie,VonReihe,Farbe,Figur),Brett),
  126.     move(Farbe,Figur,VonLinie,VonReihe,NachLinie,NachReihe,Brett),
  127.     member((NachLinie,NachReihe,Color,_),Brett),   % validiert, dass Ausgangs-
  128.     Farbe \= Color.                       % und Zielfeld gleich sind
  129.  
  130. % Hilfspraedikat: Felder auf Diagonalen
  131. diagonale([(a,5),(b,6)]).
  132. diagonale([(a,4),(b,5),(c,6)]).
  133. diagonale([(a,3),(b,4),(c,5),(d,6)]).
  134. diagonale([(a,2),(b,3),(c,4),(d,5),(e,6)]).
  135. diagonale([(a,1),(b,2),(c,3),(d,4),(e,5),(f,6)]).
  136. diagonale([(b,1),(c,2),(d,3),(e,4),(f,5)]).
  137. diagonale([(c,1),(d,2),(e,3),(f,4)]).
  138. diagonale([(d,1),(e,2),(f,3)]).
  139. diagonale([(e,1),(f,2)]).
  140. diagonale([(a,2),(b,1)]).
  141. diagonale([(a,3),(b,2),(c,1)]).
  142. diagonale([(a,4),(b,3),(c,2),(d,1)]).
  143. diagonale([(a,5),(b,4),(c,3),(d,2),(e,1)]).
  144. diagonale([(a,6),(b,5),(c,4),(d,3),(e,2),(f,1)]).
  145. diagonale([(b,6),(c,5),(d,4),(e,3),(f,2)]).
  146. diagonale([(c,6),(d,5),(e,4),(f,3)]).
  147. diagonale([(d,6),(e,5),(f,4)]).
  148. diagonale([(e,6),(f,5)]).
  149. % Hilfspraedikat: benachbarte Felder auf Linien und Reihen
  150. nachbar(a,b).
  151. nachbar(b,c).
  152. nachbar(c,d).
  153. nachbar(d,e).
  154. nachbar(e,f).
  155. nachbar(1,2).
  156. nachbar(2,3).
  157. nachbar(3,4).
  158. nachbar(4,5).
  159. nachbar(5,6).
  160.  
  161. % Figurenzuege
  162. % move(Farbe,Figur,VonLinie,VonReihe,NachLinie,NachReihe)
  163. % Koenig
  164. move(_,k,Linie,Von,Linie,Nach,_) :-
  165.     nachbar(Von,Nach).
  166. move(_,k,Linie,Von,Linie,Nach,_) :-
  167.     nachbar(Nach,Von).
  168. move(_,k,Von,Reihe,Nach,Reihe,_) :-
  169.     nachbar(Von,Nach).
  170. move(_,k,Von,Reihe,Nach,Reihe,_) :-
  171.     nachbar(Nach,Von).
  172. move(_,k,VonLinie,VonReihe,NachLinie,NachReihe,_) :-
  173.     nachbar(VonLinie,NachLinie),
  174.     nachbar(VonReihe,NachReihe).
  175. move(_,k,VonLinie,VonReihe,NachLinie,NachReihe,_) :-
  176.     nachbar(VonLinie,NachLinie),
  177.     nachbar(NachReihe,VonReihe).
  178. move(_,k,VonLinie,VonReihe,NachLinie,NachReihe,_) :-
  179.     nachbar(NachLinie,VonLinie),
  180.     nachbar(VonReihe,NachReihe).
  181. move(_,k,VonLinie,VonReihe,NachLinie,NachReihe,_) :-
  182.     nachbar(NachLinie,VonLinie),
  183.     nachbar(NachReihe,VonReihe).
  184. % Bauer weiss
  185. move(w,b,Linie,VonReihe,Linie,NachReihe,Brett) :-
  186.     nachbar(VonReihe,NachReihe),
  187.     member((Linie,NachReihe,f,f),Brett). % Zielfeld muss frei sein
  188. move(w,b,VonLinie,VonReihe,NachLinie,NachReihe,Brett) :-
  189.     nachbar(VonReihe,NachReihe),
  190.     nachbar(VonLinie,NachLinie),
  191.     member((NachLinie,NachReihe,s,_),Brett). % Zielfeld muss besetzt sein
  192. move(w,b,VonLinie,VonReihe,NachLinie,NachReihe,Brett) :-
  193.     nachbar(VonReihe,NachReihe),
  194.     nachbar(NachLinie,VonLinie),
  195.     member((NachLinie,NachReihe,s,_),Brett). % Zielfeld muss besetzt sein
  196. % Bauer schwarz
  197. move(s,b,Linie,VonReihe,Linie,NachReihe,Brett) :-
  198.     nachbar(NachReihe,VonReihe),
  199.     member((Linie,NachReihe,f,f),Brett). % Zielfeld muss frei sein
  200. move(s,b,VonLinie,VonReihe,NachLinie,NachReihe,Brett) :-
  201.     nachbar(NachReihe,VonReihe),
  202.     nachbar(VonLinie,NachLinie),
  203.     member((NachLinie,NachReihe,w,_),Brett). % Zielfeld muss besetzt sein
  204. move(s,b,VonLinie,VonReihe,NachLinie,NachReihe,Brett) :-
  205.     nachbar(NachReihe,VonReihe),
  206.     nachbar(NachLinie,VonLinie),
  207.     member((NachLinie,NachReihe,w,_),Brett). % Zielfeld muss besetzt sein
  208. % Turm
  209. move(_,t,Linie,VonReihe,Linie,NachReihe,Brett) :-
  210.     member((Linie,NachReihe,_,_),Brett),     % Instatiierung von NachReihe erforderlich
  211.     liniefrei(Linie,VonReihe,NachReihe,Brett).
  212. move(_,t,VonLinie,Reihe,NachLinie,Reihe,Brett) :-
  213.     member((NachLinie,Reihe,_,_),Brett),     % Instatiierung von NachLinie erforderlich
  214.     reihefrei(Reihe,VonLinie,NachLinie,Brett).
  215. % Laeufer
  216. move(_,l,VonLinie,VonReihe,NachLinie,NachReihe,Brett) :-
  217.     diagonale(D),
  218.     nth1(VonIndex,D,(VonLinie,VonReihe)),
  219.     nth1(NachIndex,D,(NachLinie,NachReihe)),
  220.     diagfrei(D,VonIndex,NachIndex,Brett).
  221. % Springer
  222. move(_,s,VonLinie,VonReihe,NachLinie,NachReihe,_) :-
  223.     nachbar(VonReihe,ZwR),
  224.     nachbar(ZwR,NachReihe),
  225.     nachbar(VonLinie,NachLinie).
  226. move(_,s,VonLinie,VonReihe,NachLinie,NachReihe,_) :-
  227.     nachbar(VonReihe,ZwR),
  228.     nachbar(ZwR,NachReihe),
  229.     nachbar(NachLinie,VonLinie).
  230. move(_,s,VonLinie,VonReihe,NachLinie,NachReihe,_) :-
  231.     nachbar(ZwR,VonReihe),
  232.     nachbar(NachReihe,ZwR),
  233.     nachbar(VonLinie,NachLinie).
  234. move(_,s,VonLinie,VonReihe,NachLinie,NachReihe,_) :-
  235.     nachbar(ZwR,VonReihe),
  236.     nachbar(NachReihe,ZwR),
  237.     nachbar(NachLinie,VonLinie).
  238. move(_,s,VonLinie,VonReihe,NachLinie,NachReihe,_) :-
  239.     nachbar(VonLinie,ZwL),
  240.     nachbar(ZwL,NachLinie),
  241.     nachbar(VonReihe,NachReihe).
  242. move(_,s,VonLinie,VonReihe,NachLinie,NachReihe,_) :-
  243.     nachbar(VonLinie,ZwL),
  244.     nachbar(ZwL,NachLinie),
  245.     nachbar(NachReihe,VonReihe).
  246. move(_,s,VonLinie,VonReihe,NachLinie,NachReihe,_) :-
  247.     nachbar(ZwL,VonLinie),
  248.     nachbar(NachLinie,ZwL),
  249.     nachbar(VonReihe,NachReihe).
  250. move(_,s,VonLinie,VonReihe,NachLinie,NachReihe,_) :-
  251.     nachbar(ZwL,VonLinie),
  252.     nachbar(NachLinie,ZwL),
  253.     nachbar(NachReihe,VonReihe).
  254. % Hilfsprädikate: zulässige Zugbewegungen über freie Felder
  255. liniefrei(Linie,Von,Nach,Brett) :-
  256.     Von < Nach,
  257.     V1 is Von + 1,
  258.     freielinie(Linie,V1,Nach,Brett).
  259. liniefrei(Linie,Von,Nach,Brett) :-
  260.     Nach < Von,
  261.     N1 is Nach + 1,
  262.     freielinie(Linie,N1,Von,Brett).
  263. freielinie(_,Reihe,Reihe,_).
  264. freielinie(Linie,Von,Nach,Brett) :-
  265.     member((Linie,Von,f,f),Brett), % Zwischenfeld muss frei sein
  266.     V1 is Von + 1,
  267.     freielinie(Linie,V1,Nach,Brett).
  268. reihefrei(Reihe,Von,Nach,Brett) :-
  269.     Von @< Nach,
  270.     nachbar(Von,V1),
  271.     freiereihe(Reihe,V1,Nach,Brett).
  272. reihefrei(Reihe,Von,Nach,Brett) :-
  273.     Nach @< Von,
  274.     nachbar(Nach,N1),
  275.     freiereihe(Reihe,N1,Von,Brett).
  276. freiereihe(_,Linie,Linie,_).
  277. freiereihe(Reihe,Von,Nach,Brett) :-
  278.     member((Von,Reihe,f,f),Brett), % Zwischenfeld muss frei sein
  279.     nachbar(Von,V1),
  280.     freiereihe(Reihe,V1,Nach,Brett).
  281. diagfrei(Diag,Von,Nach,Brett) :-
  282.     Von < Nach,
  283.     V1 is Von + 1,
  284.     freiediag(Diag,V1,Nach,Brett).
  285. diagfrei(Diag,Von,Nach,Brett) :-
  286.     Nach < Von,
  287.     N1 is Nach + 1,
  288.     freiediag(Diag,N1,Von,Brett).
  289. freiediag(_,Index,Index,_).
  290. freiediag(Diag,Von,Nach,Brett) :-
  291.     nth1(Von,Diag,(ZwLinie,ZwReihe)),
  292.     member((ZwLinie,ZwReihe,f,f),Brett), % Zwischenfeld muss frei sein
  293.     V1 is Von + 1,
  294.     freiediag(Diag,V1,Nach,Brett).
  295.  
  296. ziehen(Brett,(Stein,Figur,VonL,VonR,NachL,NachR,Gegner,_),Brett2Test) :-
  297.     append(Br1,[(VonL,VonR,Stein,Figur)|Br2],Brett),                          %Br1 = Liste aller Felder, die vor (VonL,VonR,Stein,Figur) in der Liste Brett stehen                                                                         %Br2 = Liste aller Felder, die hinter (VonL,VonR,Stein,Figur) in der Liste Brett stehen
  298.     append(Br1,[(VonL,VonR,f,f)|Br2],Br3),                                   %Br3 = Liste aller Felder mit dem geleerten Feld
  299.     append(Br4,[(NachL,NachR,Gegner,_)|Br5],Br3),                              %Wiederholt sich für Br4, Br5, Brett2Test(neue Stellung des Brettes nach Bewegung des Spielsteins)
  300.     append(Br4,[(NachL,NachR,Stein,Figur)|Br5],Brett2Test),!.
  301.  
  302. keinSchach(Stein,Brett2Test) :-                                           %Überprüft ob nach einer Bewegung, ob jemand Schach ist
  303.     member((Linie,Reihe,Stein,k),Brett2Test),
  304.     ruhepos(Linie,Reihe,Stein,Brett2Test),!.
  305.  
  306. ruhepos(L,R,S,B2T) :-
  307.     keineRuhePos(L,R,S,B2T),
  308.     !,fail.
  309. ruhepos(_,_,_,_).
  310.  
  311. keineRuhePos(L,R,w,B2T) :-
  312.     neben(Nl,L),
  313.     neben(R,Nr),
  314.     member((Nl,Nr,s,b),B2T),!.
  315. keineRuhePos(L,R,w,B2T) :-
  316.     neben(L,Nl),
  317.     neben(R,Nr),
  318.     member((Nl,Nr,s,b),B2T),!.
  319. keineRuhePos(L,R,s,B2T) :-
  320.     neben(Nl,L),
  321.     neben(Nr,R),
  322.     member((Nl,Nr,w,b),B2T),!.
  323. keineRuhePos(L,R,s,B2T) :-
  324.     neben(L,Nl),
  325.     neben(Nr,R),
  326.     member((Nl,Nr,w,b),B2T),!.
  327. keineRuhePos(L,R,S,B2T) :-
  328.     gegner(S,G),
  329.     neben(N,L),
  330.     member((N,R,G,k),B2T),!.
  331. keineRuhePos(L,R,S,B2T) :-
  332.     gegner(S,G),
  333.     neben(L,N),
  334.     member((N,R,G,k),B2T),!.
  335. keineRuhePos(L,R,S,B2T) :-
  336.     gegner(S,G),
  337.     neben(N,R),
  338.     member((L,N,G,k),B2T),!.
  339. keineRuhePos(L,R,S,B2T) :-
  340.     gegner(S,G),
  341.     neben(R,N),
  342.     member((L,N,G,k),B2T),!.
  343. keineRuhePos(L,R,S,B2T) :-
  344.     gegner(S,G),
  345.     neben(Nl,L),
  346.     neben(Nr,R),
  347.     member((Nl,Nr,G,k),B2T),!.
  348. keineRuhePos(L,R,S,B2T) :-
  349.     gegner(S,G),
  350.     neben(Nl,L),
  351.     neben(R,Nr),
  352.     member((Nl,Nr,G,k),B2T),!.
  353. keineRuhePos(L,R,S,B2T) :-
  354.     gegner(S,G),
  355.     neben(L,Nl),
  356.     neben(Nr,R),
  357.     member((Nl,Nr,G,k),B2T),!.
  358. keineRuhePos(L,R,S,B2T) :-
  359.     gegner(S,G),
  360.     neben(L,Nl),
  361.     neben(R,Nr),
  362.     member((Nl,Nr,G,k),B2T),!.
  363. keineRuhePos(L,R,S,B2T) :-
  364.     gegner(S,G),
  365.     neben(N,R),
  366.     neben(Nr,N),
  367.     neben(L,Nl),
  368.     member((Nl,Nr,G,s),B2T),!.
  369. keineRuhePos(L,R,S,B2T) :-
  370.     gegner(S,G),
  371.     neben(N,R),
  372.     neben(Nr,N),
  373.     neben(Nl,L),
  374.     member((Nl,Nr,G,s),B2T),!.
  375. keineRuhePos(L,R,S,B2T) :-
  376.     gegner(S,G),
  377.     neben(N,L),
  378.     neben(Nl,N),
  379.     neben(Nr,R),
  380.     member((Nl,Nr,G,s),B2T),!.
  381. keineRuhePos(L,R,S,B2T) :-
  382.     gegner(S,G),
  383.     neben(N,L),
  384.     neben(Nl,N),
  385.     neben(R,Nr),
  386.     member((Nl,Nr,G,s),B2T),!.
  387. keineRuhePos(L,R,S,B2T) :-
  388.     gegner(S,G),
  389.     neben(R,N),
  390.     neben(N,Nr),
  391.     neben(Nl,L),
  392.     member((Nl,Nr,G,s),B2T),!.
  393. keineRuhePos(L,R,S,B2T) :-
  394.     gegner(S,G),
  395.     neben(R,N),
  396.     neben(N,Nr),
  397.     neben(L,Nl),
  398.     member((Nl,Nr,G,s),B2T),!.
  399. keineRuhePos(L,R,S,B2T) :-
  400.     gegner(S,G),
  401.     neben(L,N),
  402.     neben(N,Nl),
  403.     neben(R,Nr),
  404.     member((Nl,Nr,G,s),B2T),!.
  405. keineRuhePos(L,R,S,B2T) :-
  406.     gegner(S,G),
  407.     neben(L,N),
  408.     neben(N,Nl),
  409.     neben(Nr,R),
  410.     member((Nl,Nr,G,s),B2T),!.
  411. keineRuhePos(L,R,S,B2T) :-
  412.     keineRuhePosTurmNord(L,R,S,B2T),!.
  413. keineRuhePos(L,R,S,B2T) :-
  414.     keineRuhePosTurmOst(L,R,S,B2T),!.
  415. keineRuhePos(L,R,S,B2T) :-
  416.     keineRuhePosTurmSued(L,R,S,B2T),!.
  417. keineRuhePos(L,R,S,B2T) :-
  418.     keineRuhePosTurmWest(L,R,S,B2T),!.
  419. keineRuhePos(L,R,S,B2T) :-
  420.     keineRuhePosLfrNO(L,R,S,B2T),!.
  421. keineRuhePos(L,R,S,B2T) :-
  422.     keineRuhePosLfrSO(L,R,S,B2T),!.
  423. keineRuhePos(L,R,S,B2T) :-
  424.     keineRuhePosLfrSW(L,R,S,B2T),!.
  425. keineRuhePos(L,R,S,B2T) :-
  426.     keineRuhePosLfrNW(L,R,S,B2T),!.
  427.  
  428. keineRuhePosTurmNord(L,R,S,B2T) :-
  429.     neben(R,N),
  430.     keineRuhePosNord(L,N,S,B2T),!.
  431. keineRuhePosNord(L,R,S,B2T) :-
  432.     member((L,R,f,f),B2T),!,
  433.     keineRuhePosTurmNord(L,R,S,B2T).
  434. keineRuhePosNord(L,R,S,B2T) :-
  435.     gegner(S,G),
  436.     member((L,R,G,t),B2T),!.
  437. keineRuhePosNord(_,_,_,_) :-
  438.     !,fail.
  439. keineRuhePosTurmOst(L,R,S,B2T) :-
  440.     neben(L,N),
  441.     keineRuhePosOst(N,R,S,B2T),!.
  442. keineRuhePosOst(L,R,S,B2T) :-
  443.     member((L,R,f,f),B2T),!,
  444.     keineRuhePosTurmOst(L,R,S,B2T).
  445. keineRuhePosOst(L,R,S,B2T) :-
  446.     gegner(S,G),
  447.     member((L,R,G,t),B2T),!.
  448. keineRuhePosOst(_,_,_,_) :-
  449.     !,fail.
  450. keineRuhePosTurmSued(L,R,S,B2T) :-
  451.     neben(N,R),
  452.     keineRuhePosSued(L,N,S,B2T),!.
  453. keineRuhePosSued(L,R,S,B2T) :-
  454.     member((L,R,f,f),B2T),!,
  455.     keineRuhePosTurmSued(L,R,S,B2T).
  456. keineRuhePosSued(L,R,S,B2T) :-
  457.     gegner(S,G),
  458.     member((L,R,G,t),B2T),!.
  459. keineRuhePosSued(_,_,_,_) :-
  460.     !,fail.
  461. keineRuhePosTurmWest(L,R,S,B2T) :-
  462.     neben(N,L),
  463.     keineRuhePosWest(N,R,S,B2T),!.
  464. keineRuhePosWest(L,R,S,B2T) :-
  465.     member((L,R,f,f),B2T),!,
  466.     keineRuhePosTurmWest(L,R,S,B2T).
  467. keineRuhePosWest(L,R,S,B2T) :-
  468.     gegner(S,G),
  469.     member((L,R,G,t),B2T),!.
  470. keineRuhePosWest(_,_,_,_) :-
  471.     !,fail.
  472.  
  473. keineRuhePosLfrNO(L,R,S,B2T) :-
  474.     neben(L,Nl),
  475.     neben(R,Nr),
  476.     keineRuhePosNO(Nl,Nr,S,B2T),!.
  477. keineRuhePosNO(L,R,S,B2T) :-
  478.     member((L,R,f,f),B2T),!,
  479.     keineRuhePosLfrNO(L,R,S,B2T).
  480. keineRuhePosNO(L,R,S,B2T) :-
  481.     gegner(S,G),
  482.     member((L,R,G,l),B2T),!.
  483. keineRuhePosNO(_,_,_,_) :-
  484.     !,fail.
  485. keineRuhePosLfrSO(L,R,S,B2T) :-
  486.     neben(L,Nl),
  487.     neben(Nr,R),
  488.     keineRuhePosSO(Nl,Nr,S,B2T),!.
  489. keineRuhePosSO(L,R,S,B2T) :-
  490.     member((L,R,f,f),B2T),!,
  491.     keineRuhePosLfrSO(L,R,S,B2T).
  492. keineRuhePosSO(L,R,S,B2T) :-
  493.     gegner(S,G),
  494.     member((L,R,G,l),B2T),!.
  495. keineRuhePosSO(_,_,_,_) :-
  496.     !,fail.
  497. keineRuhePosLfrSW(L,R,S,B2T) :-
  498.     neben(Nl,L),
  499.     neben(Nr,R),
  500.     keineRuhePosSW(Nl,Nr,S,B2T),!.
  501. keineRuhePosSW(L,R,S,B2T) :-
  502.     member((L,R,f,f),B2T),!,
  503.     keineRuhePosLfrSW(L,R,S,B2T).
  504. keineRuhePosSW(L,R,S,B2T) :-
  505.     gegner(S,G),
  506.     member((L,R,G,l),B2T),!.
  507. keineRuhePosSW(_,_,_,_) :-
  508.     !,fail.
  509. keineRuhePosLfrNW(L,R,S,B2T) :-
  510.     neben(Nl,L),
  511.     neben(R,Nr),
  512.     keineRuhePosNW(Nl,Nr,S,B2T),!.
  513. keineRuhePosNW(L,R,S,B2T) :-
  514.     member((L,R,f,f),B2T),!,
  515.     keineRuhePosLfrNW(L,R,S,B2T).
  516. keineRuhePosNW(L,R,S,B2T) :-
  517.     gegner(S,G),
  518.     member((L,R,G,l),B2T),!.
  519. keineRuhePosNW(_,_,_,_) :-
  520.     !,fail.
  521.  
  522. gegner(w,s).
  523. gegner(s,w).
  524.  
  525. neben(1,2).
  526. neben(2,3).
  527. neben(3,4).
  528. neben(4,5).
  529. neben(5,6).
  530. neben(a,b).
  531. neben(b,c).
  532. neben(c,d).
  533. neben(d,e).
  534. neben(e,f).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement