% Prolog code for the electrical environment.

% This is the code discussed in Section 5.3 of Poole and Mackworth, Artificial
% Intelligence: foundations of computational agents, Cambridge, 2023.
% See http://artint.info

% Copyright (c) David Poole and Alan Mackworth 2023. 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, ok_l1/0, ok_l2/0,
	   ok_cb1/0, ok_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,
	   down_s1/0, down_s2/0, down_s3/0.

% see https://artint.info/3e/html/ArtInt3e.Ch5.S3.html for meanings of symbols

light_l1.
light_l2.
ok_l1.
ok_l2.
ok_cb1.
ok_cb2.
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.
%down_s1.
up_s1.
up_s2.
up_s3.

% some queries:
% ?- light_l1.
% ?- lit_l1.
% ?- lit_l2.
