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

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"