Skip to content

Instantly share code, notes, and snippets.

@lgrz
Last active January 18, 2019 20:30
Show Gist options
  • Save lgrz/484b6a36814a9c6e14cf to your computer and use it in GitHub Desktop.
Save lgrz/484b6a36814a9c6e14cf to your computer and use it in GitHub Desktop.
// Original Jing program for reference
prolog some: 2;
prolog op_unify: 2;
prolog below_floor: 1;
prolog above_floor: 1;
prolog next_floor_to_serve: 1;
action down: 0;
action up: 0;
action off: 1;
action open: 0;
action close: 0;
fun fluent floor: 0;
fun fluent light: 1;
procedure go_floor(N) {
while (~op_unify(floor, N)) {
if (below_floor(N)) {
up;
} else {
down;
}
}
}
procedure serve_a_floor() {
pick #n {
?(next_floor_to_serve(#n));
go_floor(#n);
open;
close;
off(#n);
}
}
procedure control() {
while (some(n, op_unify(light(n), on))) {
serve_a_floor();
}
go_floor(1);
open;
}
% This is the original Golog elevator with no exogenous events, no sensing
% Serve each floor whose call button is on initially, then park the elevator.
% run: ?- indigolog(control).
%
% No user input is required.
% Interface to the outside world via read and write
execute(A,Sr) :- ask_execute(A,Sr).
exog_occurs(_) :- fail.
fl(N) :- N=1; N=2; N=3; N=4; N=5; N=6. % the 6 elevator floors
% Actions
prim_action(down). % elevator down one floor
prim_action(up). % elevator up one floor
prim_action(off(N)) :- fl(N). % turn off call button on floor n
prim_action(open). % open elevator door
prim_action(close). % close elevator door
% Fluents
prim_fluent(floor). % the floor the elevator is on (1 to 6)
prim_fluent(light(N)) :- fl(N). % call button of floor n (on or off)
% Causal laws
causes_val(up, floor, N, N is floor+1).
causes_val(down, floor, N, N is floor-1).
causes_val(off(N), light(N), off, true). % Note: nothing turns a light on
% Preconditions of prim actions
poss(down, neg(floor=1)).
poss(up, neg(floor=6)).
poss(off(N), and(floor=N,light(N)=on)).
poss(open, true).
poss(close, true).
% Initial state: elevator is at floor 3, and lights 2 and 5 are on
initially(floor,3).
initially(light(1), off).
initially(light(2), on).
initially(light(3), off).
initially(light(4), off).
initially(light(5), on).
initially(light(6), off).
% Definitions of complex conditions
proc(below_floor(N), floor<N).
proc(above_floor(N), floor>N).
proc(next_floor_to_serve(N), light(N)=on).
% Helper to get around the limitations of the Jing language
op_unify(S, T) :- S = T.
%
% The following is now generated from a Jing program
%
% proc(go_floor(N), while(neg(floor=N), if(below_floor(N),up,down))).
% proc(serve_a_floor, pi(n,
% [ ?(next_floor_to_serve(n)), go_floor(n), open, close, off(n) ])).
% proc(control,
% [ while( some(n,light(n)=on), serve_a_floor ),
% go_floor(1),
% open ] ).
% output generated via Jing
proc(go_floor(N), [while(neg(op_unify(floor, N)), [if(below_floor(N), [up], [down])])]).
proc(serve_a_floor, [pi(p_n, [?(next_floor_to_serve(p_n)), go_floor(p_n), open, close, off(p_n)])]).
proc(control, [while(some(n, op_unify(light(n), on)), [serve_a_floor]), go_floor(1), open]).
#!/usr/bin/env swipl -f -q -s
:- ['/path/to/indigolog/Interpreters/indigolog-vanilla_swi'].
:- initialization main.
% load IndiGolog elevator example1
:- [elevator].
% load Jing elevator example1
:- [elevator_jing].
main :- indigolog(control),
halt(0).
Copy link

ghost commented Jan 18, 2019

what is elevator.jing ????????????

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment