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

Comment signer la connexion OKEx API version 5 avec websockets ?

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"