Déterminer le prologue du prédicat d'état suivant
J'ai une liste avec 5 éléments, 2 éléments noirs, 2 blancs et un emplacement vide ("v"). J'ai un état représenté par [w, w, v, b, b] avec un joueur blanc et un joueur noir.
Chaque joueur joue tour à tour, et peut faire avancer un de ses éléments. Il ne peut pas le faire reculer.
Je veux écrire un prédicat qui détermine tous les états possibles après que le joueur P a joué.
Par exemple, nous aurons:
next_state([w, w, v, b, b], W, L).
L = [v, w, w, b, b];
L = [w, v, w, b, b];
false.
Mais je ne sais pas comment procéder. Merci
Solution du problème
Si la règle du saut par-dessus la pièce du même joueur se limite à avancer d'un maximum de 2 positions, cela devrait suffire :
player(w, forwards).
player(b, backwards).
state_player_next(State, Player, State1):-
player(Player, Direction),
( Direction == forwards ->
state_player_next_(State, Player, State1)
; reverse(State, StateReverse),
state_player_next_(StateReverse, Player, State1Reverse),
reverse(State1Reverse, State1)
).
% Make move in correct direction, leaving behind space (v)
state_player_next_([Player, Next|T], Player, [v, Player|T]):-
% Can't take own piece
dif(Player, Next).
% Jump over the player's 1 other piece
state_player_next_([Player, Player, Next|T], Player, [v, Player, Player|T]):-
% Can't take own piece
dif(Player, Next).
% Piece (or space) stays where it is
state_player_next_([P|T], Player, [P|State1]):-
state_player_next_(T, Player, State1).
Résultat dans swi-prolog :
?- state_player_next([w, w, v, b, b], Player, LstNext).
Player = w,
LstNext = [v,w,w,b,b];
Player = w,
LstNext = [w,v,w,b,b];
Player = b,
LstNext = [w,w,b,b,v];
Player = b,
LstNext = [w,w,b,v,b];
false.
Commentaires
Enregistrer un commentaire