%% Son Tran's translator program - b2s.pl
%%
%% input:  a Prolog program representing a domain 
%%         description in Language B
%% output: a domain description and a domain problem 
%%	   which will be used as input to Smodels
%%
%% The b2s translator is currently capable of handling
%% the following features:
%%	
%% a. Dynamic Causal Laws of the form:
%%    causes(A,F,P) iff action A causes fluent literal F 
%%		        to be true if preconditions P hold.
%%
%& b. Static Causal Laws:
%%    caused(F,G) iff set of fluent literals G causes fluent  
%%	              literal F to be true.
%%
%% c. Defaults:
%%    default(F,G) - normally fluent literal F holds in any state 
%%		     which satisfies G.
%%
%% d. Executability conditions:
%%    impossible(A,G) iff it is not possible to execute 
%% 	                  action A if set of fluent literals G hold.
%%
%% e. Constraints:
%%    constraint(L) iff list L is satisfied in any state.
%% 
%% f. Serialization of actions:
%%    Concurrent actions are not allowed.
%%
%% g. Initial state:
%%    initially(F) iff fluent literal F holds in the initial state.  
%%
%% h. Goal state:
%%    goal(F) iff fluent literal F holds in the final state.
%%
%% Program b2s.pl will separate the above rules into two different files 
%% which will be used as input to Smodels:
%% 1. (a) through (f) will be used to generate the domain description file,
%% 2. (g) and (h) will be used to generate the domain problem file.
%% 
%% Notice that b2s will only work correctly if the following
%% predicates are defined in the domain description input file:
%% 1. fluent(F) iff F is a fluent.
%% 2. action(A) iff A is an action.
%%
%%--------------------------------------------------------------------------
%%  To use the b2s program:
%%  1. Compile b2s.pl using Quintus Prolog
%%  2. At the Quintus Prolog prompt, type:  gen. 
%%     and press <enter>
%%  3. Enter the name of input/output files when requested.
%%--------------------------------------------------------------------------

:- use_module(library(files)).
:- use_module(library(lineio)).
:- use_module(library(strings)).
:- use_module(library(lists)).

:- unknown(_,fail).


%%%
%%% Collecting static causal laws
%%% and translating them into rules suitable for SMODELS
%%%

pr_static_causal(Id):-
        findall((X,Y), caused(X,Y), Z),
        nl(Id),  
        write(Id, '%%% Section: static causal laws %%%%'), nl(Id), nl(Id),
        pr_static_causal(Z, Id).

pr_static_causal([], Id):-
        nl(Id),  
        write(Id, '%%% End section: static causal laws %%%%'), nl(Id).


pr_static_causal([(L,C)|T], Id):-
        add_time(L, 'T', Id), write(Id, ' :-  time(T), '),
        add_time_list(C, 'T', Id), write(Id, '.'), nl(Id), 
        pr_static_causal(T, Id).



%%%
%%% Collecting default laws
%%% and translating them into rules suitable for SMODELS
%%%

pr_default(Id):-
        findall((X,Y), default(X,Y), Z),
        nl(Id),  
        write(Id, '%%% Section: default laws %%%%'), nl(Id), nl(Id),
        pr_default(Z, Id).

pr_default([], Id):-
        nl(Id),  
        write(Id, '%%% End section: default laws %%%%'), nl(Id).

pr_default([(L,C)|T], Id):-
        add_time(L, 'T', Id), 
        write(Id, ' :-  time(T), '),
        add_time_list(C, 'T', Id),
        length(C,N),
        (
          eq(N,0) ->
          write(Id, ' not '),
          add_time_contrary(L, Id)
          |
          write(Id, ', not '),
          add_time_contrary(L, Id)          
        ),      
        write(Id, '.'), nl(Id), 
        pr_default(T, Id).

add_time_contrary(L, Id):-
        fluent(L),
        add_time(neg(L), 'T', Id).          

add_time_contrary(neg(L), Id):-
        fluent(L),
        add_time(L, 'T', Id).          



%%%
%%% Collecting dynamic causal laws 
%%% and translating them into rules suitable for SMODELS
%%%

pr_dynamic_causal(Id) :-
        findall((A,X,Y), causes(A,X,Y), Z),
        nl(Id),  
        write(Id, '%%% Section: dynamic causal laws %%%%'), nl(Id), 
        pr_dynamic_causal(Z, Id).

pr_dynamic_causal([], Id):-
        nl(Id),  
        write(Id, '%%% End section: dynamic causal laws %%%%'), nl(Id).

pr_dynamic_causal([(A,L,C)|T], Id):-
        add_time(L, 'T1', Id), 
        write(Id, ' :- '),
        write(Id, ' next(T,T1),'),
        add_time(A, 'T', Id),
        length(C,N),
        (
          eq(N,0) ->
          write(Id, '.'), nl(Id)
          |
          write(Id, ','),
          add_time_list(C, 'T', Id),
          write(Id, '.'), nl(Id) 
        ),      
        pr_dynamic_causal(T, Id).



%%%
%%% Generating inertial rules for fluent literals
%%% one rule per fluent literal
%%%

non_inertial(L):-
        fluent(L),
        default(L,_).

non_inertial(L):-
        fluent(L),
        default(neg(L),_).


is_inertial(L):-
        fluent(L),
        \+ non_inertial(L).

pr_inertial(Id):-
        findall(X, (fluent(X),is_inertial(X)), Y1),
        remove_dups(Y1, Y),
        nl(Id),  
        write(Id, '%%% Section: inertial %%%%'),
        nl(Id),  
        pr_inertial(Y, Id).

pr_inertial([], Id):-
        nl(Id),  
        write(Id, '%%% End section: inertial %%%%'), nl(Id). 


pr_inertial([H|T], Id):-
        pr_line(H, Id), nl(Id), 
        pr_line(neg(H), Id), nl(Id), 
        pr_inertial(T, Id).


pr_line(H, Id):-
        fluent(H),
        add_time(H, 'T1', Id),
        write(Id, '  :-  next(T,T1),'),
        add_time(H, 'T', Id),
        write(Id, ', not '),
        add_time(neg(H), 'T1', Id),
        write(Id, '.').

pr_line(neg(H), Id):-
        fluent(H),
        add_time(neg(H),'T1', Id),
        write(Id, '  :-  next(T,T1),'),
        add_time(neg(H), 'T', Id),
        write(Id, ', not '),
        add_time(H, 'T1', Id),
        write(Id, '.').


%%%
%%% Generating initial rules for fluent literals
%%% one rule per fluent literal
%%%

pr_initial(Id) :-
        findall(X, (fluent(X),is_inertial(X)), Z1),
        remove_dups(Z1, Z),
        nl(Id), 
        write(Id, '%%% Section: initial conditions are exogenous %%%%'),
        nl(Id), 
        pr_initial(Z, Id).

pr_initial([], Id):-
        nl(Id), 
        write(Id, '%%% End section: initial conditions are exogenous %%%%'),
        nl(Id).

pr_initial([L|T], Id):-
        pri_line(L, Id), nl(Id), 
        pri_line(neg(L), Id),nl(Id), 
        pr_initial(T, Id).

pri_line(H, Id):-
        fluent(H),
        add_time(H, '0', Id),
        write(Id, '  :-  not '),
        add_time(neg(H), '0', Id),
        write(Id, '.').

pri_line(neg(H), Id):-
        fluent(H),
        add_time(neg(H),'0', Id),
        write(Id, '  :-  not '),
        add_time(H, '0', Id),
        write(Id, '.').



%%%
%%% Generating rules for 'actions are exogenous'
%%% two rules for each action
%%%

pr_ex_action(Id):-
        findall(A, action(A), Z),
        nl(Id), 
        write(Id, '%%% Section: actions are exogenous %%%%'),
        nl(Id), 
        pr_ex_action(Z, Id).

pr_ex_action([], Id):-
        nl(Id), 
        write(Id, '%%% End of section: actions are exogenous %%%%'),
        nl(Id).

pr_ex_action([A|T], Id):-
        add_time(A, 'T', Id),
        write(Id, ' :-  time(T), not '),
        add_time(neg(A), 'T', Id),
        write(Id, '.'), nl(Id),
        add_time(neg(A), 'T', Id),
        write(Id, ' :-  time(T), not '),
        add_time(A, 'T', Id),
        write(Id, '.'), nl(Id),
        pr_ex_action(T, Id).



%%%
%%% Generating rules for section 'no actions are executed at last time'
%%% one per action
%%%

pr_no_action(Id):-
        findall(A, action(A), Z),
        nl(Id), 
        write(Id, '%%% Section: no actions are executed at last time %%'),
        nl(Id),
        pr_no_action(Z, Id).

pr_no_action([], Id):-
        nl(Id),  
        write(Id, '%%% End of section: no actions are executed at last time %%%%'),
        nl(Id).

pr_no_action([A|T], Id):-
        write(Id, ':- '),
        add_time(A, 'lasttime', Id),
        write(Id, '.'), nl(Id),
        pr_no_action(T, Id).


%%%
%%% Adding the two auxiliary predicates to the domain file
%%%

pr_auxiliary(Id):-
        write(Id, '%%% Auxiliary predicates '),
        nl(Id), nl(Id),
        write(Id, 'time(0..lasttime).'),
        nl(Id),
        write(Id, 'next(T,T1):- time(T), time(T1), T1 = T + 1.'),
        nl(Id).


%%%
%%% Generating rules for each constraint
%%%
%%%

pr_constraint(Id):-
        findall(X, constraint(X), Z),
        nl(Id), 
        write(Id, '%%% Section: Constraints %%'),
        nl(Id),
        pr_constraint(Z,Id).

pr_constraint([],Id):-
        nl(Id),  
        write(Id, '%%% End of section: Constraints %%%%'),
        nl(Id).

pr_constraint([A|T],Id):-
        write(Id, ':- time(T), '),
        add_time_list(A, 'T',Id),
        write(Id, '.'), nl(Id),
        pr_constraint(T,Id).



%%%
%%% Generating rules for each executability condition
%%%
%%%

pr_impossible(Id):-
        findall((X,Y), impossible(X,Y), Z),
        nl(Id), 
        write(Id, '%%% Section: Executability Conditions %%'),
        nl(Id),
        pr_impossible(Z,Id).

pr_impossible([],Id):-
        nl(Id),  
        write(Id, '%%% End of section: Executability Conditions %%%%'),
        nl(Id).

pr_impossible([(A,L)|T],Id):-
        write(Id, ':- time(T), '),
        add_time(A, 'T',Id),
        length(L,N),
        (
          eq(N,0) ->
          write(Id, '.'), nl(id)
          |
          write(Id, ','),
          add_time_list(L, 'T',Id), write(Id, '.'), nl(Id)
        ),
        pr_impossible(T,Id).


%%%
%%% pr_serial
%%%
%%%

pr_serial(Id):-
        findall(A, action(A), Z),
        nl(Id), 
        write(Id, '%%% Section: Serialization of Actions %%%'),
        nl(Id),
        pr_serial(Z,Id).

pr_serial([],Id):-
        nl(Id),  
        write(Id, '%%% End of section: Serialtization of Actions  %%%%'),
        nl(Id).

pr_serial([A|T],Id):-
        pr_serial_list(A,T,Id),
        pr_serial(T,Id).

pr_serial_list(_,[],Id).

pr_serial_list(A,[H|T],Id):-
        write(Id, ':- time(T), '),
        add_time(A, 'T',Id), write(Id, ', '),
        add_time(H, 'T',Id), write(Id, '. '), nl(Id),
        pr_serial_list(A,T,Id).


%%%
%%% Generating problem output file which includes
%%% the initial situation and the goal
%%%

pr_initsit_goal(Id) :-
	findall(I, initially(I), Z),
	findall(G, goal(G), Z1),
	nl(Id),
	write(Id, '%%% File with Initial Conditions and Goal for Smodels %%%'),
	nl(Id), nl(Id),
	write(Id, 'compute 1 {'),
	pr_initsituation(Z,Id),
	length(Z1,N),
	(
	   eq(N,0) ->
	   write(Id,'}'), nl(Id), nl(Id), 
           write(Id, '%%% End of file with Initial Conditions and Goal %%%%'),
           nl(Id)
           |
           write(Id,', '),	   
	   pr_goal(Z1,Id)
	 ).

pr_initsituation([],Id).

pr_initsituation([G|T],Id) :-
	add_lasttime(G, '0', Id),
	length(T,N),
	(
	   eq(N,0) ->
	   pr_initsituation([],Id)
	   |
	   write(Id,', '),
	   pr_initsituation(T,Id)
	 ).


pr_goal([],Id):-
	write(Id,'}'),
        nl(Id), nl(Id), 
        write(Id, '%%% End of file with Initial Conditions and Goal %%%%'),
        nl(Id).
	
pr_goal([G|T],Id) :-
        add_lasttime(G, 'lasttime', Id), 
	length(T,N),
	(
	   eq(N,0) ->
	    pr_goal([],Id)
	   |
	   write(Id,', '),
	   pr_goal(T,Id)
	 ).
        
        
add_lasttime(Term, Y, Id) :-
	Term=..X,
	length(X,N),
	(
	   eq(N,1) ->
	   write_first(X,Id), write(Id,'('), write(Id,Y), write(Id,')')
	   |
	   write_list(X, Y, Id)
	).

write_list([G|T], Y, Id) :-
	(
	   eq(neg,G) ->
	   write(Id,'n'), add_list(T, Y, Id)
	   |
           write(Id, G),
           write(Id,'('),
           write_args(T, Y, Id)
        ).

	
add_list([H|T], Y, Id) :-
	H=..X,
	length(X,N),
	(
           eq(N,1) ->
           write_first(X,Id), write(Id,'('), write(Id,Y), write(Id,')')
           |
           write_list(X, Y, Id)
        ).

write_args([], Y, Id) :-
	write(Id, Y), write(Id, ')').

write_args([H|T], Y, Id) :-
	write(Id, H),
	write(Id, ','),
	write_args(T, Y, Id).
	
 

%%%
%%% add_time(Term, Y, Id)
%%%       inserting one parameter to Term
%%%         the parameter indicates the time point
%%%         Y can be: now (T), next (T1), last (lasttime), zero (0)
%%%      

add_time(Term, Y, Id):-            
        Term =.. X,     
        length(X,N),
        (
          eq(N,1) ->
          write_first(X, Id), write(Id, '('), write(Id, Y), write(Id, ')')
          |
          write_time(X, Y, Id)
        ).

write_first([X|_], Id):- write(Id, X).

write_time([A|T], Y, Id):-
        (
           eq(neg,A) ->
            write(Id, 'n'),
            add_time_list(T, Y, Id)
           |
            write(Id, A),
            write_arg(T, Y, Id)
        ).

write_arg(T, Y, Id):-
        write(Id, '('),
        write_next(T, Y, Id).


write_next([], Y, Id):-
        write(Id, Y), write(Id, ')').

write_next([H|T], Y, Id):-
        write(Id, H), write(Id, ','), write_next(T, Y, Id).


add_time_list([], _, Id).

add_time_list([H|T], Y, Id):-
        add_time(H, Y, Id),
        length(T,N),
        (
          eq(N,0) -> 
            write(Id, '') | write(Id, ',')
        ),
        add_time_list(T, Y, Id).


eq(X,X).



%%%
%%% for Quintus program 
%%%


gen:-
        write(' Enter domain description file name: '),
        get_line(S), atom_chars(Source, S), %%% get the source file name
        consult(Source),
        write(' Enter domain description output file name: '),
        get_line(F), atom_chars(FileDescr, F), %%% get the domain output file name
        write(' Enter problem output file name: '),
        get_line(G), atom_chars(FileProbl, G), %%% get the problem output file name
        write(' Generating .... '),
        open_file(FileDescr, write, X),
        pr_dynamic_causal(X),
        pr_static_causal(X),
        pr_inertial(X),
        pr_initial(X),
        pr_ex_action(X),
        pr_no_action(X),
        pr_auxiliary(X),
        pr_constraint(X),
	pr_impossible(X),
	pr_serial(X),
        pr_default(X),
        close(X),
        open_file(FileProbl, write, Y),
        pr_initsit_goal(Y),
        close(Y).


================

 monkey_domain: domain input file for Smodels produced by the translator

%%% Section: dynamic causal laws %%%%
on(monkey,box,T1) :-  next(T,T1),climb_on(monkey,box,T).
on(monkey,trainer,T1) :-  next(T,T1),climb_on(monkey,trainer,T).
at(box,l1,T1) :-  next(T,T1),push_box(monkey,l1,T).
at(box,l2,T1) :-  next(T,T1),push_box(monkey,l2,T).
at(box,l3,T1) :-  next(T,T1),push_box(monkey,l3,T).
at(box,l4,T1) :-  next(T,T1),push_box(monkey,l4,T).
at(monkey,l1,T1) :-  next(T,T1),push_box(monkey,l1,T).
at(monkey,l2,T1) :-  next(T,T1),push_box(monkey,l2,T).
at(monkey,l3,T1) :-  next(T,T1),push_box(monkey,l3,T).
at(monkey,l4,T1) :-  next(T,T1),push_box(monkey,l4,T).
at(monkey,l1,T1) :-  next(T,T1),walk(monkey,l1,T).
at(monkey,l2,T1) :-  next(T,T1),walk(monkey,l2,T).
at(monkey,l3,T1) :-  next(T,T1),walk(monkey,l3,T).
at(monkey,l4,T1) :-  next(T,T1),walk(monkey,l4,T).
at(trainer,l1,T1) :-  next(T,T1),walk(trainer,l1,T).
at(trainer,l2,T1) :-  next(T,T1),walk(trainer,l2,T).
at(trainer,l3,T1) :-  next(T,T1),walk(trainer,l3,T).
at(trainer,l4,T1) :-  next(T,T1),walk(trainer,l4,T).
at(monkey,l1,T1) :-  next(T,T1),walk(trainer,l1,T),on(monkey,trainer,T).
at(monkey,l2,T1) :-  next(T,T1),walk(trainer,l2,T),on(monkey,trainer,T).
at(monkey,l3,T1) :-  next(T,T1),walk(trainer,l3,T),on(monkey,trainer,T).
at(monkey,l4,T1) :-  next(T,T1),walk(trainer,l4,T),on(monkey,trainer,T).
has_banana(monkey,T1) :-  next(T,T1),grab_banana(monkey,T).
prompted(trainer,T1) :-  next(T,T1),scream(monkey,T).

%%% End section: dynamic causal laws %%%%

%%% Section: static causal laws %%%%

nat(box,l1,T) :-  time(T), at(box,l2,T).
nat(box,l1,T) :-  time(T), at(box,l3,T).
nat(box,l1,T) :-  time(T), at(box,l4,T).
nat(box,l2,T) :-  time(T), at(box,l1,T).
nat(box,l2,T) :-  time(T), at(box,l3,T).
nat(box,l2,T) :-  time(T), at(box,l4,T).
nat(box,l3,T) :-  time(T), at(box,l1,T).
nat(box,l3,T) :-  time(T), at(box,l2,T).
nat(box,l3,T) :-  time(T), at(box,l4,T).
nat(box,l4,T) :-  time(T), at(box,l1,T).
nat(box,l4,T) :-  time(T), at(box,l2,T).
nat(box,l4,T) :-  time(T), at(box,l3,T).
nat(banana,l1,T) :-  time(T), at(banana,l2,T).
nat(banana,l1,T) :-  time(T), at(banana,l3,T).
nat(banana,l1,T) :-  time(T), at(banana,l4,T).
nat(banana,l2,T) :-  time(T), at(banana,l1,T).
nat(banana,l2,T) :-  time(T), at(banana,l3,T).
nat(banana,l2,T) :-  time(T), at(banana,l4,T).
nat(banana,l3,T) :-  time(T), at(banana,l1,T).
nat(banana,l3,T) :-  time(T), at(banana,l2,T).
nat(banana,l3,T) :-  time(T), at(banana,l4,T).
nat(banana,l4,T) :-  time(T), at(banana,l1,T).
nat(banana,l4,T) :-  time(T), at(banana,l2,T).
nat(banana,l4,T) :-  time(T), at(banana,l3,T).
nat(monkey,l1,T) :-  time(T), at(monkey,l2,T).
nat(monkey,l1,T) :-  time(T), at(monkey,l3,T).
nat(monkey,l1,T) :-  time(T), at(monkey,l4,T).
nat(monkey,l2,T) :-  time(T), at(monkey,l1,T).
nat(monkey,l2,T) :-  time(T), at(monkey,l3,T).
nat(monkey,l2,T) :-  time(T), at(monkey,l4,T).
nat(monkey,l3,T) :-  time(T), at(monkey,l1,T).
nat(monkey,l3,T) :-  time(T), at(monkey,l2,T).
nat(monkey,l3,T) :-  time(T), at(monkey,l4,T).
nat(monkey,l4,T) :-  time(T), at(monkey,l1,T).
nat(monkey,l4,T) :-  time(T), at(monkey,l2,T).
nat(monkey,l4,T) :-  time(T), at(monkey,l3,T).
nat(trainer,l1,T) :-  time(T), at(trainer,l2,T).
nat(trainer,l1,T) :-  time(T), at(trainer,l3,T).
nat(trainer,l1,T) :-  time(T), at(trainer,l4,T).
nat(trainer,l2,T) :-  time(T), at(trainer,l1,T).
nat(trainer,l2,T) :-  time(T), at(trainer,l3,T).
nat(trainer,l2,T) :-  time(T), at(trainer,l4,T).
nat(trainer,l3,T) :-  time(T), at(trainer,l1,T).
nat(trainer,l3,T) :-  time(T), at(trainer,l2,T).
nat(trainer,l3,T) :-  time(T), at(trainer,l4,T).
nat(trainer,l4,T) :-  time(T), at(trainer,l1,T).
nat(trainer,l4,T) :-  time(T), at(trainer,l2,T).
nat(trainer,l4,T) :-  time(T), at(trainer,l3,T).
at(banana,l1,T) :-  time(T), has_banana(monkey,T),at(monkey,l1,T).
at(banana,l2,T) :-  time(T), has_banana(monkey,T),at(monkey,l2,T).
at(banana,l3,T) :-  time(T), has_banana(monkey,T),at(monkey,l3,T).
at(banana,l4,T) :-  time(T), has_banana(monkey,T),at(monkey,l4,T).

%%% End section: static causal laws %%%%

%%% Section: inertial %%%%
has_banana(monkey,T1)  :-  next(T,T1),has_banana(monkey,T), not nhas_banana(monkey,T1).
nhas_banana(monkey,T1)  :-  next(T,T1),nhas_banana(monkey,T), not has_banana(monkey,T1).
at(banana,l1,T1)  :-  next(T,T1),at(banana,l1,T), not nat(banana,l1,T1).
nat(banana,l1,T1)  :-  next(T,T1),nat(banana,l1,T), not at(banana,l1,T1).
at(banana,l2,T1)  :-  next(T,T1),at(banana,l2,T), not nat(banana,l2,T1).
nat(banana,l2,T1)  :-  next(T,T1),nat(banana,l2,T), not at(banana,l2,T1).
at(banana,l3,T1)  :-  next(T,T1),at(banana,l3,T), not nat(banana,l3,T1).
nat(banana,l3,T1)  :-  next(T,T1),nat(banana,l3,T), not at(banana,l3,T1).
at(banana,l4,T1)  :-  next(T,T1),at(banana,l4,T), not nat(banana,l4,T1).
nat(banana,l4,T1)  :-  next(T,T1),nat(banana,l4,T), not at(banana,l4,T1).
at(box,l1,T1)  :-  next(T,T1),at(box,l1,T), not nat(box,l1,T1).
nat(box,l1,T1)  :-  next(T,T1),nat(box,l1,T), not at(box,l1,T1).
at(box,l2,T1)  :-  next(T,T1),at(box,l2,T), not nat(box,l2,T1).
nat(box,l2,T1)  :-  next(T,T1),nat(box,l2,T), not at(box,l2,T1).
at(box,l3,T1)  :-  next(T,T1),at(box,l3,T), not nat(box,l3,T1).
nat(box,l3,T1)  :-  next(T,T1),nat(box,l3,T), not at(box,l3,T1).
at(box,l4,T1)  :-  next(T,T1),at(box,l4,T), not nat(box,l4,T1).
nat(box,l4,T1)  :-  next(T,T1),nat(box,l4,T), not at(box,l4,T1).
at(monkey,l1,T1)  :-  next(T,T1),at(monkey,l1,T), not nat(monkey,l1,T1).
nat(monkey,l1,T1)  :-  next(T,T1),nat(monkey,l1,T), not at(monkey,l1,T1).
at(monkey,l2,T1)  :-  next(T,T1),at(monkey,l2,T), not nat(monkey,l2,T1).
nat(monkey,l2,T1)  :-  next(T,T1),nat(monkey,l2,T), not at(monkey,l2,T1).
at(monkey,l3,T1)  :-  next(T,T1),at(monkey,l3,T), not nat(monkey,l3,T1).
nat(monkey,l3,T1)  :-  next(T,T1),nat(monkey,l3,T), not at(monkey,l3,T1).
at(monkey,l4,T1)  :-  next(T,T1),at(monkey,l4,T), not nat(monkey,l4,T1).
nat(monkey,l4,T1)  :-  next(T,T1),nat(monkey,l4,T), not at(monkey,l4,T1).
at(trainer,l1,T1)  :-  next(T,T1),at(trainer,l1,T), not nat(trainer,l1,T1).
nat(trainer,l1,T1)  :-  next(T,T1),nat(trainer,l1,T), not at(trainer,l1,T1).
at(trainer,l2,T1)  :-  next(T,T1),at(trainer,l2,T), not nat(trainer,l2,T1).
nat(trainer,l2,T1)  :-  next(T,T1),nat(trainer,l2,T), not at(trainer,l2,T1).
at(trainer,l3,T1)  :-  next(T,T1),at(trainer,l3,T), not nat(trainer,l3,T1).
nat(trainer,l3,T1)  :-  next(T,T1),nat(trainer,l3,T), not at(trainer,l3,T1).
at(trainer,l4,T1)  :-  next(T,T1),at(trainer,l4,T), not nat(trainer,l4,T1).
nat(trainer,l4,T1)  :-  next(T,T1),nat(trainer,l4,T), not at(trainer,l4,T1).
on(monkey,box,T1)  :-  next(T,T1),on(monkey,box,T), not non(monkey,box,T1).
non(monkey,box,T1)  :-  next(T,T1),non(monkey,box,T), not on(monkey,box,T1).
on(monkey,trainer,T1)  :-  next(T,T1),on(monkey,trainer,T), not non(monkey,trainer,T1).
non(monkey,trainer,T1)  :-  next(T,T1),non(monkey,trainer,T), not on(monkey,trainer,T1).

%%% End section: inertial %%%%

%%% Section: initial conditions are exogenous %%%%
has_banana(monkey,0)  :-  not nhas_banana(monkey,0).
nhas_banana(monkey,0)  :-  not has_banana(monkey,0).
at(banana,l1,0)  :-  not nat(banana,l1,0).
nat(banana,l1,0)  :-  not at(banana,l1,0).
at(banana,l2,0)  :-  not nat(banana,l2,0).
nat(banana,l2,0)  :-  not at(banana,l2,0).
at(banana,l3,0)  :-  not nat(banana,l3,0).
nat(banana,l3,0)  :-  not at(banana,l3,0).
at(banana,l4,0)  :-  not nat(banana,l4,0).
nat(banana,l4,0)  :-  not at(banana,l4,0).
at(box,l1,0)  :-  not nat(box,l1,0).
nat(box,l1,0)  :-  not at(box,l1,0).
at(box,l2,0)  :-  not nat(box,l2,0).
nat(box,l2,0)  :-  not at(box,l2,0).
at(box,l3,0)  :-  not nat(box,l3,0).
nat(box,l3,0)  :-  not at(box,l3,0).
at(box,l4,0)  :-  not nat(box,l4,0).
nat(box,l4,0)  :-  not at(box,l4,0).
at(monkey,l1,0)  :-  not nat(monkey,l1,0).
nat(monkey,l1,0)  :-  not at(monkey,l1,0).
at(monkey,l2,0)  :-  not nat(monkey,l2,0).
nat(monkey,l2,0)  :-  not at(monkey,l2,0).
at(monkey,l3,0)  :-  not nat(monkey,l3,0).
nat(monkey,l3,0)  :-  not at(monkey,l3,0).
at(monkey,l4,0)  :-  not nat(monkey,l4,0).
nat(monkey,l4,0)  :-  not at(monkey,l4,0).
at(trainer,l1,0)  :-  not nat(trainer,l1,0).
nat(trainer,l1,0)  :-  not at(trainer,l1,0).
at(trainer,l2,0)  :-  not nat(trainer,l2,0).
nat(trainer,l2,0)  :-  not at(trainer,l2,0).
at(trainer,l3,0)  :-  not nat(trainer,l3,0).
nat(trainer,l3,0)  :-  not at(trainer,l3,0).
at(trainer,l4,0)  :-  not nat(trainer,l4,0).
nat(trainer,l4,0)  :-  not at(trainer,l4,0).
on(monkey,box,0)  :-  not non(monkey,box,0).
non(monkey,box,0)  :-  not on(monkey,box,0).
on(monkey,trainer,0)  :-  not non(monkey,trainer,0).
non(monkey,trainer,0)  :-  not on(monkey,trainer,0).

%%% End section: initial conditions are exogenous %%%%

%%% Section: actions are exogenous %%%%
climb_on(monkey,box,T) :-  time(T), not nclimb_on(monkey,box,T).
nclimb_on(monkey,box,T) :-  time(T), not climb_on(monkey,box,T).
climb_on(monkey,trainer,T) :-  time(T), not nclimb_on(monkey,trainer,T).
nclimb_on(monkey,trainer,T) :-  time(T), not climb_on(monkey,trainer,T).
push_box(monkey,l1,T) :-  time(T), not npush_box(monkey,l1,T).
npush_box(monkey,l1,T) :-  time(T), not push_box(monkey,l1,T).
push_box(monkey,l2,T) :-  time(T), not npush_box(monkey,l2,T).
npush_box(monkey,l2,T) :-  time(T), not push_box(monkey,l2,T).
push_box(monkey,l3,T) :-  time(T), not npush_box(monkey,l3,T).
npush_box(monkey,l3,T) :-  time(T), not push_box(monkey,l3,T).
push_box(monkey,l4,T) :-  time(T), not npush_box(monkey,l4,T).
npush_box(monkey,l4,T) :-  time(T), not push_box(monkey,l4,T).
walk(monkey,l1,T) :-  time(T), not nwalk(monkey,l1,T).
nwalk(monkey,l1,T) :-  time(T), not walk(monkey,l1,T).
walk(monkey,l2,T) :-  time(T), not nwalk(monkey,l2,T).
nwalk(monkey,l2,T) :-  time(T), not walk(monkey,l2,T).
walk(monkey,l3,T) :-  time(T), not nwalk(monkey,l3,T).
nwalk(monkey,l3,T) :-  time(T), not walk(monkey,l3,T).
walk(monkey,l4,T) :-  time(T), not nwalk(monkey,l4,T).
nwalk(monkey,l4,T) :-  time(T), not walk(monkey,l4,T).
walk(trainer,l1,T) :-  time(T), not nwalk(trainer,l1,T).
nwalk(trainer,l1,T) :-  time(T), not walk(trainer,l1,T).
walk(trainer,l2,T) :-  time(T), not nwalk(trainer,l2,T).
nwalk(trainer,l2,T) :-  time(T), not walk(trainer,l2,T).
walk(trainer,l3,T) :-  time(T), not nwalk(trainer,l3,T).
nwalk(trainer,l3,T) :-  time(T), not walk(trainer,l3,T).
walk(trainer,l4,T) :-  time(T), not nwalk(trainer,l4,T).
nwalk(trainer,l4,T) :-  time(T), not walk(trainer,l4,T).
grab_banana(monkey,T) :-  time(T), not ngrab_banana(monkey,T).
ngrab_banana(monkey,T) :-  time(T), not grab_banana(monkey,T).
scream(monkey,T) :-  time(T), not nscream(monkey,T).
nscream(monkey,T) :-  time(T), not scream(monkey,T).

%%% End of section: actions are exogenous %%%%

%%% Section: no actions are executed at last time %%
:- climb_on(monkey,box,lasttime).
:- climb_on(monkey,trainer,lasttime).
:- push_box(monkey,l1,lasttime).
:- push_box(monkey,l2,lasttime).
:- push_box(monkey,l3,lasttime).
:- push_box(monkey,l4,lasttime).
:- walk(monkey,l1,lasttime).
:- walk(monkey,l2,lasttime).
:- walk(monkey,l3,lasttime).
:- walk(monkey,l4,lasttime).
:- walk(trainer,l1,lasttime).
:- walk(trainer,l2,lasttime).
:- walk(trainer,l3,lasttime).
:- walk(trainer,l4,lasttime).
:- grab_banana(monkey,lasttime).
:- scream(monkey,lasttime).

%%% End of section: no actions are executed at last time %%%%
%%% Auxiliary predicates 

time(0..lasttime).
next(T,T1):- time(T), time(T1), T1 = T + 1.

%%% Section: Constraints %%

%%% End of section: Constraints %%%%

%%% Section: Executability Conditions %%
:- time(T), climb_on(monkey,box,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), climb_on(monkey,box,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), climb_on(monkey,box,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), climb_on(monkey,box,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), climb_on(monkey,trainer,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), climb_on(monkey,trainer,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), climb_on(monkey,trainer,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), climb_on(monkey,trainer,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), push_box(monkey,l1,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), push_box(monkey,l1,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), push_box(monkey,l1,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), push_box(monkey,l1,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), push_box(monkey,l2,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), push_box(monkey,l2,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), push_box(monkey,l2,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), push_box(monkey,l2,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), push_box(monkey,l3,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), push_box(monkey,l3,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), push_box(monkey,l3,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), push_box(monkey,l3,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), push_box(monkey,l4,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), push_box(monkey,l4,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), push_box(monkey,l4,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), push_box(monkey,l4,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), walk(monkey,l1,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), walk(monkey,l1,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), walk(monkey,l1,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), walk(monkey,l1,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), walk(monkey,l2,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), walk(monkey,l2,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), walk(monkey,l2,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), walk(monkey,l2,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), walk(monkey,l3,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), walk(monkey,l3,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), walk(monkey,l3,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), walk(monkey,l3,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), walk(monkey,l4,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), walk(monkey,l4,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), walk(monkey,l4,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), walk(monkey,l4,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), walk(trainer,l1,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), walk(trainer,l1,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), walk(trainer,l1,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), walk(trainer,l2,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), walk(trainer,l2,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), walk(trainer,l2,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), walk(trainer,l3,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), walk(trainer,l3,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), walk(trainer,l3,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), walk(trainer,l4,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), walk(trainer,l4,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), walk(trainer,l4,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), grab_banana(monkey,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), grab_banana(monkey,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), grab_banana(monkey,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), grab_banana(monkey,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), scream(monkey,T),prompted(trainer,T),at(monkey,l1,T).
:- time(T), scream(monkey,T),prompted(trainer,T),at(monkey,l2,T).
:- time(T), scream(monkey,T),prompted(trainer,T),at(monkey,l3,T).
:- time(T), scream(monkey,T),prompted(trainer,T),at(monkey,l4,T).
:- time(T), climb_on(monkey,box,T),on(monkey,box,T).
:- time(T), climb_on(monkey,trainer,T),on(monkey,trainer,T).
:- time(T), climb_on(monkey,box,T),at(monkey,l1,T),at(box,l2,T).
:- time(T), climb_on(monkey,box,T),at(monkey,l1,T),at(box,l3,T).
:- time(T), climb_on(monkey,box,T),at(monkey,l1,T),at(box,l4,T).
:- time(T), climb_on(monkey,box,T),at(monkey,l2,T),at(box,l1,T).
:- time(T), climb_on(monkey,box,T),at(monkey,l2,T),at(box,l3,T).
:- time(T), climb_on(monkey,box,T),at(monkey,l2,T),at(box,l4,T).
:- time(T), climb_on(monkey,box,T),at(monkey,l3,T),at(box,l1,T).
:- time(T), climb_on(monkey,box,T),at(monkey,l3,T),at(box,l2,T).
:- time(T), climb_on(monkey,box,T),at(monkey,l3,T),at(box,l4,T).
:- time(T), climb_on(monkey,box,T),at(monkey,l4,T),at(box,l1,T).
:- time(T), climb_on(monkey,box,T),at(monkey,l4,T),at(box,l2,T).
:- time(T), climb_on(monkey,box,T),at(monkey,l4,T),at(box,l3,T).
:- time(T), climb_on(monkey,trainer,T),at(monkey,l1,T),at(trainer,l2,T).
:- time(T), climb_on(monkey,trainer,T),at(monkey,l1,T),at(trainer,l3,T).
:- time(T), climb_on(monkey,trainer,T),at(monkey,l1,T),at(trainer,l4,T).
:- time(T), climb_on(monkey,trainer,T),at(monkey,l2,T),at(trainer,l1,T).
:- time(T), climb_on(monkey,trainer,T),at(monkey,l2,T),at(trainer,l3,T).
:- time(T), climb_on(monkey,trainer,T),at(monkey,l2,T),at(trainer,l4,T).
:- time(T), climb_on(monkey,trainer,T),at(monkey,l3,T),at(trainer,l1,T).
:- time(T), climb_on(monkey,trainer,T),at(monkey,l3,T),at(trainer,l2,T).
:- time(T), climb_on(monkey,trainer,T),at(monkey,l3,T),at(trainer,l4,T).
:- time(T), climb_on(monkey,trainer,T),at(monkey,l4,T),at(trainer,l1,T).
:- time(T), climb_on(monkey,trainer,T),at(monkey,l4,T),at(trainer,l2,T).
:- time(T), climb_on(monkey,trainer,T),at(monkey,l4,T),at(trainer,l3,T).
:- time(T), push_box(monkey,l1,T),on(monkey,box,T).
:- time(T), push_box(monkey,l1,T),on(monkey,trainer,T).
:- time(T), push_box(monkey,l2,T),on(monkey,box,T).
:- time(T), push_box(monkey,l2,T),on(monkey,trainer,T).
:- time(T), push_box(monkey,l3,T),on(monkey,box,T).
:- time(T), push_box(monkey,l3,T),on(monkey,trainer,T).
:- time(T), push_box(monkey,l4,T),on(monkey,box,T).
:- time(T), push_box(monkey,l4,T),on(monkey,trainer,T).
:- time(T), push_box(monkey,l1,T),at(box,l1,T).
:- time(T), push_box(monkey,l2,T),at(box,l2,T).
:- time(T), push_box(monkey,l3,T),at(box,l3,T).
:- time(T), push_box(monkey,l4,T),at(box,l4,T).
:- time(T), push_box(monkey,l1,T),at(monkey,l1,T),at(box,l2,T).
:- time(T), push_box(monkey,l1,T),at(monkey,l1,T),at(box,l3,T).
:- time(T), push_box(monkey,l1,T),at(monkey,l1,T),at(box,l4,T).
:- time(T), push_box(monkey,l1,T),at(monkey,l2,T),at(box,l1,T).
:- time(T), push_box(monkey,l1,T),at(monkey,l2,T),at(box,l3,T).
:- time(T), push_box(monkey,l1,T),at(monkey,l2,T),at(box,l4,T).
:- time(T), push_box(monkey,l1,T),at(monkey,l3,T),at(box,l1,T).
:- time(T), push_box(monkey,l1,T),at(monkey,l3,T),at(box,l2,T).
:- time(T), push_box(monkey,l1,T),at(monkey,l3,T),at(box,l4,T).
:- time(T), push_box(monkey,l1,T),at(monkey,l4,T),at(box,l1,T).
:- time(T), push_box(monkey,l1,T),at(monkey,l4,T),at(box,l2,T).
:- time(T), push_box(monkey,l1,T),at(monkey,l4,T),at(box,l3,T).
:- time(T), push_box(monkey,l2,T),at(monkey,l1,T),at(box,l2,T).
:- time(T), push_box(monkey,l2,T),at(monkey,l1,T),at(box,l3,T).
:- time(T), push_box(monkey,l2,T),at(monkey,l1,T),at(box,l4,T).
:- time(T), push_box(monkey,l2,T),at(monkey,l2,T),at(box,l1,T).
:- time(T), push_box(monkey,l2,T),at(monkey,l2,T),at(box,l3,T).
:- time(T), push_box(monkey,l2,T),at(monkey,l2,T),at(box,l4,T).
:- time(T), push_box(monkey,l2,T),at(monkey,l3,T),at(box,l1,T).
:- time(T), push_box(monkey,l2,T),at(monkey,l3,T),at(box,l2,T).
:- time(T), push_box(monkey,l2,T),at(monkey,l3,T),at(box,l4,T).
:- time(T), push_box(monkey,l2,T),at(monkey,l4,T),at(box,l1,T).
:- time(T), push_box(monkey,l2,T),at(monkey,l4,T),at(box,l2,T).
:- time(T), push_box(monkey,l2,T),at(monkey,l4,T),at(box,l3,T).
:- time(T), push_box(monkey,l3,T),at(monkey,l1,T),at(box,l2,T).
:- time(T), push_box(monkey,l3,T),at(monkey,l1,T),at(box,l3,T).
:- time(T), push_box(monkey,l3,T),at(monkey,l1,T),at(box,l4,T).
:- time(T), push_box(monkey,l3,T),at(monkey,l2,T),at(box,l1,T).
:- time(T), push_box(monkey,l3,T),at(monkey,l2,T),at(box,l3,T).
:- time(T), push_box(monkey,l3,T),at(monkey,l2,T),at(box,l4,T).
:- time(T), push_box(monkey,l3,T),at(monkey,l3,T),at(box,l1,T).
:- time(T), push_box(monkey,l3,T),at(monkey,l3,T),at(box,l2,T).
:- time(T), push_box(monkey,l3,T),at(monkey,l3,T),at(box,l4,T).
:- time(T), push_box(monkey,l3,T),at(monkey,l4,T),at(box,l1,T).
:- time(T), push_box(monkey,l3,T),at(monkey,l4,T),at(box,l2,T).
:- time(T), push_box(monkey,l3,T),at(monkey,l4,T),at(box,l3,T).
:- time(T), push_box(monkey,l4,T),at(monkey,l1,T),at(box,l2,T).
:- time(T), push_box(monkey,l4,T),at(monkey,l1,T),at(box,l3,T).
:- time(T), push_box(monkey,l4,T),at(monkey,l1,T),at(box,l4,T).
:- time(T), push_box(monkey,l4,T),at(monkey,l2,T),at(box,l1,T).
:- time(T), push_box(monkey,l4,T),at(monkey,l2,T),at(box,l3,T).
:- time(T), push_box(monkey,l4,T),at(monkey,l2,T),at(box,l4,T).
:- time(T), push_box(monkey,l4,T),at(monkey,l3,T),at(box,l1,T).
:- time(T), push_box(monkey,l4,T),at(monkey,l3,T),at(box,l2,T).
:- time(T), push_box(monkey,l4,T),at(monkey,l3,T),at(box,l4,T).
:- time(T), push_box(monkey,l4,T),at(monkey,l4,T),at(box,l1,T).
:- time(T), push_box(monkey,l4,T),at(monkey,l4,T),at(box,l2,T).
:- time(T), push_box(monkey,l4,T),at(monkey,l4,T),at(box,l3,T).
:- time(T), walk(monkey,l1,T),on(monkey,box,T).
:- time(T), walk(monkey,l1,T),on(monkey,trainer,T).
:- time(T), walk(monkey,l2,T),on(monkey,box,T).
:- time(T), walk(monkey,l2,T),on(monkey,trainer,T).
:- time(T), walk(monkey,l3,T),on(monkey,box,T).
:- time(T), walk(monkey,l3,T),on(monkey,trainer,T).
:- time(T), walk(monkey,l4,T),on(monkey,box,T).
:- time(T), walk(monkey,l4,T),on(monkey,trainer,T).
:- time(T), walk(monkey,l1,T),at(monkey,l1,T).
:- time(T), walk(monkey,l2,T),at(monkey,l2,T).
:- time(T), walk(monkey,l3,T),at(monkey,l3,T).
:- time(T), walk(monkey,l4,T),at(monkey,l4,T).
:- time(T), walk(trainer,l1,T),at(trainer,l1,T).
:- time(T), walk(trainer,l2,T),at(trainer,l2,T).
:- time(T), walk(trainer,l3,T),at(trainer,l3,T).
:- time(T), walk(trainer,l4,T),at(trainer,l4,T).
:- time(T), grab_banana(monkey,T),has_banana(monkey,T).
:- time(T), grab_banana(monkey,T),at(monkey,l1,T),at(banana,l2,T).
:- time(T), grab_banana(monkey,T),at(monkey,l1,T),at(banana,l3,T).
:- time(T), grab_banana(monkey,T),at(monkey,l1,T),at(banana,l4,T).
:- time(T), grab_banana(monkey,T),at(monkey,l2,T),at(banana,l1,T).
:- time(T), grab_banana(monkey,T),at(monkey,l2,T),at(banana,l3,T).
:- time(T), grab_banana(monkey,T),at(monkey,l2,T),at(banana,l4,T).
:- time(T), grab_banana(monkey,T),at(monkey,l3,T),at(banana,l1,T).
:- time(T), grab_banana(monkey,T),at(monkey,l3,T),at(banana,l2,T).
:- time(T), grab_banana(monkey,T),at(monkey,l3,T),at(banana,l4,T).
:- time(T), grab_banana(monkey,T),at(monkey,l4,T),at(banana,l1,T).
:- time(T), grab_banana(monkey,T),at(monkey,l4,T),at(banana,l2,T).
:- time(T), grab_banana(monkey,T),at(monkey,l4,T),at(banana,l3,T).
:- time(T), grab_banana(monkey,T),non(monkey,box,T),non(monkey,trainer,T).
:- time(T), scream(monkey,T),on(monkey,box,T).
:- time(T), scream(monkey,T),on(monkey,trainer,T).
:- time(T), scream(monkey,T),at(monkey,l1,T),at(trainer,l1,T).
:- time(T), scream(monkey,T),at(monkey,l2,T),at(trainer,l2,T).
:- time(T), scream(monkey,T),at(monkey,l3,T),at(trainer,l3,T).
:- time(T), scream(monkey,T),at(monkey,l4,T),at(trainer,l4,T).

%%% End of section: Executability Conditions %%%%

%%% Section: Serialization of Actions %%%
:- time(T), climb_on(monkey,box,T), climb_on(monkey,trainer,T). 
:- time(T), climb_on(monkey,box,T), push_box(monkey,l1,T). 
:- time(T), climb_on(monkey,box,T), push_box(monkey,l2,T). 
:- time(T), climb_on(monkey,box,T), push_box(monkey,l3,T). 
:- time(T), climb_on(monkey,box,T), push_box(monkey,l4,T). 
:- time(T), climb_on(monkey,box,T), walk(monkey,l1,T). 
:- time(T), climb_on(monkey,box,T), walk(monkey,l2,T). 
:- time(T), climb_on(monkey,box,T), walk(monkey,l3,T). 
:- time(T), climb_on(monkey,box,T), walk(monkey,l4,T). 
:- time(T), climb_on(monkey,box,T), walk(trainer,l1,T). 
:- time(T), climb_on(monkey,box,T), walk(trainer,l2,T). 
:- time(T), climb_on(monkey,box,T), walk(trainer,l3,T). 
:- time(T), climb_on(monkey,box,T), walk(trainer,l4,T). 
:- time(T), climb_on(monkey,box,T), grab_banana(monkey,T). 
:- time(T), climb_on(monkey,box,T), scream(monkey,T). 
:- time(T), climb_on(monkey,trainer,T), push_box(monkey,l1,T). 
:- time(T), climb_on(monkey,trainer,T), push_box(monkey,l2,T). 
:- time(T), climb_on(monkey,trainer,T), push_box(monkey,l3,T). 
:- time(T), climb_on(monkey,trainer,T), push_box(monkey,l4,T). 
:- time(T), climb_on(monkey,trainer,T), walk(monkey,l1,T). 
:- time(T), climb_on(monkey,trainer,T), walk(monkey,l2,T). 
:- time(T), climb_on(monkey,trainer,T), walk(monkey,l3,T). 
:- time(T), climb_on(monkey,trainer,T), walk(monkey,l4,T). 
:- time(T), climb_on(monkey,trainer,T), walk(trainer,l1,T). 
:- time(T), climb_on(monkey,trainer,T), walk(trainer,l2,T). 
:- time(T), climb_on(monkey,trainer,T), walk(trainer,l3,T). 
:- time(T), climb_on(monkey,trainer,T), walk(trainer,l4,T). 
:- time(T), climb_on(monkey,trainer,T), grab_banana(monkey,T). 
:- time(T), climb_on(monkey,trainer,T), scream(monkey,T). 
:- time(T), push_box(monkey,l1,T), push_box(monkey,l2,T). 
:- time(T), push_box(monkey,l1,T), push_box(monkey,l3,T). 
:- time(T), push_box(monkey,l1,T), push_box(monkey,l4,T). 
:- time(T), push_box(monkey,l1,T), walk(monkey,l1,T). 
:- time(T), push_box(monkey,l1,T), walk(monkey,l2,T). 
:- time(T), push_box(monkey,l1,T), walk(monkey,l3,T). 
:- time(T), push_box(monkey,l1,T), walk(monkey,l4,T). 
:- time(T), push_box(monkey,l1,T), walk(trainer,l1,T). 
:- time(T), push_box(monkey,l1,T), walk(trainer,l2,T). 
:- time(T), push_box(monkey,l1,T), walk(trainer,l3,T). 
:- time(T), push_box(monkey,l1,T), walk(trainer,l4,T). 
:- time(T), push_box(monkey,l1,T), grab_banana(monkey,T). 
:- time(T), push_box(monkey,l1,T), scream(monkey,T). 
:- time(T), push_box(monkey,l2,T), push_box(monkey,l3,T). 
:- time(T), push_box(monkey,l2,T), push_box(monkey,l4,T). 
:- time(T), push_box(monkey,l2,T), walk(monkey,l1,T). 
:- time(T), push_box(monkey,l2,T), walk(monkey,l2,T). 
:- time(T), push_box(monkey,l2,T), walk(monkey,l3,T). 
:- time(T), push_box(monkey,l2,T), walk(monkey,l4,T). 
:- time(T), push_box(monkey,l2,T), walk(trainer,l1,T). 
:- time(T), push_box(monkey,l2,T), walk(trainer,l2,T). 
:- time(T), push_box(monkey,l2,T), walk(trainer,l3,T). 
:- time(T), push_box(monkey,l2,T), walk(trainer,l4,T). 
:- time(T), push_box(monkey,l2,T), grab_banana(monkey,T). 
:- time(T), push_box(monkey,l2,T), scream(monkey,T). 
:- time(T), push_box(monkey,l3,T), push_box(monkey,l4,T). 
:- time(T), push_box(monkey,l3,T), walk(monkey,l1,T). 
:- time(T), push_box(monkey,l3,T), walk(monkey,l2,T). 
:- time(T), push_box(monkey,l3,T), walk(monkey,l3,T). 
:- time(T), push_box(monkey,l3,T), walk(monkey,l4,T). 
:- time(T), push_box(monkey,l3,T), walk(trainer,l1,T). 
:- time(T), push_box(monkey,l3,T), walk(trainer,l2,T). 
:- time(T), push_box(monkey,l3,T), walk(trainer,l3,T). 
:- time(T), push_box(monkey,l3,T), walk(trainer,l4,T). 
:- time(T), push_box(monkey,l3,T), grab_banana(monkey,T). 
:- time(T), push_box(monkey,l3,T), scream(monkey,T). 
:- time(T), push_box(monkey,l4,T), walk(monkey,l1,T). 
:- time(T), push_box(monkey,l4,T), walk(monkey,l2,T). 
:- time(T), push_box(monkey,l4,T), walk(monkey,l3,T). 
:- time(T), push_box(monkey,l4,T), walk(monkey,l4,T). 
:- time(T), push_box(monkey,l4,T), walk(trainer,l1,T). 
:- time(T), push_box(monkey,l4,T), walk(trainer,l2,T). 
:- time(T), push_box(monkey,l4,T), walk(trainer,l3,T). 
:- time(T), push_box(monkey,l4,T), walk(trainer,l4,T). 
:- time(T), push_box(monkey,l4,T), grab_banana(monkey,T). 
:- time(T), push_box(monkey,l4,T), scream(monkey,T). 
:- time(T), walk(monkey,l1,T), walk(monkey,l2,T). 
:- time(T), walk(monkey,l1,T), walk(monkey,l3,T). 
:- time(T), walk(monkey,l1,T), walk(monkey,l4,T). 
:- time(T), walk(monkey,l1,T), walk(trainer,l1,T). 
:- time(T), walk(monkey,l1,T), walk(trainer,l2,T). 
:- time(T), walk(monkey,l1,T), walk(trainer,l3,T). 
:- time(T), walk(monkey,l1,T), walk(trainer,l4,T). 
:- time(T), walk(monkey,l1,T), grab_banana(monkey,T). 
:- time(T), walk(monkey,l1,T), scream(monkey,T). 
:- time(T), walk(monkey,l2,T), walk(monkey,l3,T). 
:- time(T), walk(monkey,l2,T), walk(monkey,l4,T). 
:- time(T), walk(monkey,l2,T), walk(trainer,l1,T). 
:- time(T), walk(monkey,l2,T), walk(trainer,l2,T). 
:- time(T), walk(monkey,l2,T), walk(trainer,l3,T). 
:- time(T), walk(monkey,l2,T), walk(trainer,l4,T). 
:- time(T), walk(monkey,l2,T), grab_banana(monkey,T). 
:- time(T), walk(monkey,l2,T), scream(monkey,T). 
:- time(T), walk(monkey,l3,T), walk(monkey,l4,T). 
:- time(T), walk(monkey,l3,T), walk(trainer,l1,T). 
:- time(T), walk(monkey,l3,T), walk(trainer,l2,T). 
:- time(T), walk(monkey,l3,T), walk(trainer,l3,T). 
:- time(T), walk(monkey,l3,T), walk(trainer,l4,T). 
:- time(T), walk(monkey,l3,T), grab_banana(monkey,T). 
:- time(T), walk(monkey,l3,T), scream(monkey,T). 
:- time(T), walk(monkey,l4,T), walk(trainer,l1,T). 
:- time(T), walk(monkey,l4,T), walk(trainer,l2,T). 
:- time(T), walk(monkey,l4,T), walk(trainer,l3,T). 
:- time(T), walk(monkey,l4,T), walk(trainer,l4,T). 
:- time(T), walk(monkey,l4,T), grab_banana(monkey,T). 
:- time(T), walk(monkey,l4,T), scream(monkey,T). 
:- time(T), walk(trainer,l1,T), walk(trainer,l2,T). 
:- time(T), walk(trainer,l1,T), walk(trainer,l3,T). 
:- time(T), walk(trainer,l1,T), walk(trainer,l4,T). 
:- time(T), walk(trainer,l1,T), grab_banana(monkey,T). 
:- time(T), walk(trainer,l1,T), scream(monkey,T). 
:- time(T), walk(trainer,l2,T), walk(trainer,l3,T). 
:- time(T), walk(trainer,l2,T), walk(trainer,l4,T). 
:- time(T), walk(trainer,l2,T), grab_banana(monkey,T). 
:- time(T), walk(trainer,l2,T), scream(monkey,T). 
:- time(T), walk(trainer,l3,T), walk(trainer,l4,T). 
:- time(T), walk(trainer,l3,T), grab_banana(monkey,T). 
:- time(T), walk(trainer,l3,T), scream(monkey,T). 
:- time(T), walk(trainer,l4,T), grab_banana(monkey,T). 
:- time(T), walk(trainer,l4,T), scream(monkey,T). 
:- time(T), grab_banana(monkey,T), scream(monkey,T). 

%%% End of section: Serialtization of Actions  %%%%

%%% Section: default laws %%%%

nprompted(trainer,T) :-  time(T),  not prompted(trainer,T).

%%% End section: default laws %%%%

====================

  monkey_problem - initial situation and goal file produced by the translator

%%% File with Initial Conditions and Goal for Smodels %%%

compute 1 {non(monkey,box,0), non(monkey,trainer,0), nhas_banana(monkey,0),
at(monkey,l1,0), at(banana,l2,0), at(box,l3,0), at(trainer,l4,0),
nprompted(trainer,0), has_banana(monkey,lasttime)}

%%% End of file with Initial Conditions and Goal %%%%
