Mover entre estados(implementación A Prolog)
state-space (1)
Creo que la lógica debería ser en cambio
move([L, M, S], [NewLarge, NewMedium, S]) :-
Diff is min(5 - M, L),
Diff > 0,
NewLarge is L - Diff, %calculate the new Large
NewMedium is M + Diff. %calculate the new Medium
Estoy tratando de implementar un programa de prólogo que implemente la búsqueda de profundidad en primer lugar y amplíe la búsqueda en primer lugar para resolver el siguiente problema
Rowena tiene tres vasos sin marcar de diferentes tamaños: 3 onzas, 5 onzas y 8 onzas. El vaso más grande está lleno. ¿Qué puede hacer Rowena para obtener 4 onzas de líquido en cada una de las dos copas más grandes?
Tendré (Grande, Medio, Pequeño)
Entonces, el estado inicial es (8,0,0) y el estado objetivo es (4,4,0).
Ahora sé que tengo 6 movimientos disponibles en el espacio de estado.
(1,2) Vierta grande en medio o pequeño (3,4) Vierta medio en grande o pequeño (5,6) Vierta pequeño en medio o grande
Ahora solo necesito ayuda con la primera regla y el resto lo averiguaré. Así que solo puedo verter lo grande en el medio si el tamaño grande> 0 y mediano no está lleno, y el nuevo tamaño grande se convierte en el tamaño grande anterior menos la cantidad que se vertió en el soporte y el medio nuevo se convierte en el medio anterior más el monto eso fue vertido en él, y lo pequeño por supuesto nunca cambia.
Esto es lo que intenté.
%move rule #1: Pour Large into Medium (L--> M)
%move(oldstate,newstate)
move([L, M, S], [NewLarge,NewMedium,S]) :-
L > 0, %We can''t move large into medium if Large has nothing
M < 5, %We can''t pour into the medium if medium is full
Diff = 5 - M,
NewLarge is L - Diff, %calculate the new Large
NewMedium is M + (L - NewLarge). %calculate the new Medium
¿Es esta una implementación correcta del primer movimiento disponible (grande en medio). ¿Obtuve la lógica correcta allí?