es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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).
Tags:  

Answer

  1. Avatar for 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:

    next_move(Board, Moves):-
      (swapup(Board,Result); true), % utiliza el predicado fail aquí para saltar la función cuando devuelve falso
      swapdown(Board,Result),
      swapright(Board,Result),
      swapleft(Board,Result).
    

    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.

Comments are closed.