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

La fonction GCP Cloud pour écrire des données dans BigQuery s'exécute avec succès, mais les données n'apparaissent pas dans la table BigQuery

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

Le shell POSIX (sh) redirige stderr vers stdout et capture stderr et stdout dans des variables