% adaptado de Bratko, I. (1986) "Prolog: Programming for Artificial Intelligene". Addison-Wesley.
% estado inicial: el mono está en la puerta,
% Mono está en el piso,
% Box está en la ventana,
% El mono no tiene plátano.
%
% estructura de prólogo: structName (val1, val2, ...)
% de estado (ubicación del mono en la habitación, mono en la caja / en el piso, ubicación de la caja, tiene / no tiene banana)
% acciones legales
do (estado (medio, bandeja de entrada, medio, no tiene),% agarrar plátano
agarrar,
estado (medio, onbox, medio, has)).
do (estado (L, en el piso, L, plátano),% cuadro de ascenso
subida,
estado (L, onbox, L, Banana)).
do (estado (L1, onfloor, L1, Banana),% cuadro de inserción de L1 a L2
empujar (L1, L2),
estado (L2, onfloor, L2, Banana)).
do (estado (L1, en el piso, caja, plátano),% de caminata de L1 a L2
caminar (L1, L2),
estado (L2, piso, caja, plátano)).
% canget (Estado): el mono puede obtener plátano en estado
canget (estado (_, _, _, has)). % Mono ya lo tiene, estado objetivo
canget (State1): -% no estado de objetivo, hacer un trabajo para conseguirlo
hacer (Estado1, Acción, Estado2),% hacer algo (agarrar, trepar, empujar, caminar)
canget (Estado2). % canget from State2
% obtener plan = lista de acciones
canget (estado (_, _, _, has), []). % Mono ya lo tiene, estado objetivo
canget (State1, Plan): -% no estado de objetivo, hacer un trabajo para conseguirlo
hacer (Estado1, Acción, Estado2),% hacer algo (agarrar, trepar, empujar, caminar)
canget (State2, PartialPlan),% canget from State2
agregar (Acción, Plan parcial, Plan). % agregar acción al plan
agregar (X, L, [X | L]).
%? - canget (estado (atdoor, onfloor, atwindow, hasnot), Plan).
% Plan = [caminar (puerta, ventana), empujar (ventana, centro), subir, agarrar]
% Si
%? - canget (estado (atwindow, onbox, atwindow, hasnot), Plan).
% No
%? - canget (estado (Monkey, onfloor, atwindow, hasnot), Plan).
% Monkey = atwindow
% Plan = [empujar (en la ventana, centro), subir, agarrar]
% Si