% Prolog code for the electrical environment.
% This is the code discussed in Section 5.2 of Poole and Mackworth, Artificial
% Intelligence: foundations of computational agents, Cambridge, 2010.
% See http://artint.info
% Copyright (c) David Poole and Alan Mackworth 2010. This program
% is released under GPL, version 3 or later; see http://www.gnu.org/licenses/gpl.html
% The dynamic declaration prevents undefined predicate errors.
:- dynamic lit_l1/0, lit_l2/0, light_l1/0, light_l2/0, broken_l1/0, broken_l2/0,
broken_cb1/0, broken_cb2/0, live_outside/0, live_l1/0, live_l2/0,
live_w0/0, live_w1/0, live_w2/0, live_w3/0, live_w4/0,
live_w5/0, live_w6/0, up_s1/0, up_s2/0, up_s3/0.
light_l1.
light_l2.
live_outside.
live_l1 :- live_w0.
live_w0 :- live_w1, up_s2.
live_w0 :- live_w2, down_s2.
live_w1 :- live_w3, up_s1.
live_w2 :- live_w3, down_s1.
live_l2 :- live_w4.
live_w4 :- live_w3, up_s3.
live_p_1 :- live_w3.
live_w3 :- live_w5, ok_cb1.
live_p_2 :- live_w6.
live_w6 :- live_w5, ok_cb2.
live_w5 :- live_outside.
lit_l1 :- light_l1, live_l1, ok_l1.
lit_l2 :- light_l2, live_l2, ok_l2.
ok_l1 :- \+ broken_l1.
ok_l2 :- \+ broken_l2.
ok_cb1 :- \+ broken_cb1.
ok_cb2 :- \+ broken_cb2.
down_s1 :- \+ up_s1.
down_s2 :- \+ up_s2.
down_s3 :- \+ up_s3.
up_s2.
up_s3.
% some queries:
% ?- down_s1.
% ?- down_s2.
% ?- lit_l1.
% ?- lit_l2.