¿Cómo decirle a Prolog que si la función devuelve falso, entonces omítela? (juego de puzzle de 15)
He creado una función en la cual llamo a varias funciones, pero cuando una de ellas devuelve false, la función principal se detiene y devuelve false. ¿Hay alguna manera de decirle a Prolog que si la función devuelve false, la omita y verifique el resto?
En detalle: Estoy intentando hacer el juego de “15 Puzzle” como proyecto y quiero hacer una función que me dé todos los posibles movimientos siguientes.
Termino llamando a todas las funciones anteriores que controlan la casilla vacía.
Quiero que esta función devuelva todos los movimientos posibles siguientes.
Aquí está el código completo:
position([Tile|_], Tile, 0).
position([_|Tail], Tile, Index):-
position(Tail, Tile, Index1),
Index is Index1+1.
swap(Board,I,J,R) :-
same_length(Board,R),
append(BeforeI,[AtI|PastI],Board),
append(BeforeI,[AtJ|PastI],Bs),
append(BeforeJ,[AtJ|PastJ],Bs),
append(BeforeJ,[AtI|PastJ],R),
length(BeforeI,I),
length(BeforeJ,J).
swapup(Board,Result):-
position(Board,0,Index),
Index \=0,
Index \=1,
Index \=2,
Index \=3,
Up is Index-4,
swap(Board,Up,Index,Result).
swapdown(Board,Result):-
position(_,0,Index),
Index \=12,
Index \=13,
Index \=14,
Index \=15,
Down is Index+4,
swap(Board, Down, Index, Result).
swapright(Board,Result):-
position(_,0,Index),
Index \=3,
Index \=7,
Index \=11,
Index \=15,
Right is Index+1,
swap(Board, Right, Index, Result).
swapleft(Board,Result):-
position(_,0,Index),
Index \=0,
Index \=4,
Index \=8,
Index \=12,
Left is Index-1,
swap(Board, Left, Index, Result).
swap(Board,Result) :- swapup(Board,Result).
swap(Board,Result) :- swapdown(Board,Result).
swap(Board,Result) :- swapright(Board,Result).
swap(Board,Result) :- swapleft(Board,Result).
next_move(Board,Moves) :- findall(Result,swap(Board,Result),Moves).
davy.ai
Para saltar una función cuando devuelve falso y verificar el resto, puedes usar el predicado
fail
dentro de la función que potencialmente puede devolver falso. Esto hará que Prolog retroceda y continúe con la siguiente opción.Por ejemplo, digamos que quieres saltar la función
swapup
cuando devuelve falso y continuar con el resto de las funciones:Esto solo omitirá
swapup
cuando devuelva falso, pero el resto de las funciones seguirán ejecutándose.Ten en cuenta que envolvemos
swapup
entre paréntesis y usamos la sintaxis; true
para evitar que Prolog genere una excepción cuando la función devuelve falso.