Skip to content

Don't Drive Drunk

Note

View the source code for this example here.

The don't drive drunk example encoding is a simple ASP encoding with variables. It models a scenario where there are two people, Gabriel and Clare. If any of the two people are drunk and also drives they get sentenced and have to go to prison.

Don't Drive Drunk Example
Illustration of the Don't Drive Drunk Problem

Usage

Explanation:

asplain examples/dont_drive_drunk/encoding.lp 1 --log info --query "sentence(gabriel,innocent)"

Encodings

Base Encoding:

% @label("{} is a person",(P,)) :: person(P)
% @label("{} is driving",(P,)) :: drive(P)
% @label("{} is drinking alcohol",(P,)) :: alcohol(P)
% @label("{} is resisting the authorities",(P,)) :: resist(P)
% @label("{} is punished",(P,)) :: punish(P)
% @label("{} is sentenced to prison",(P,)) :: sentence(P, prison)
% @label("{} is innocent",(P,)) :: sentence(P, innocent)

% @label("{} is punished since they drove drunk",(P,))
punish(P) :- drive(P), alcohol(P),  person(P).
% @label("{} is punished since they resisted the authorities ",(P,))
punish(P) :- resist(P), person(P).

% @label("{} is innocent since they were not punished",(P,))
sentence(P, prison) :- punish(P).
% @label("{} is innocent since they were not punished",(P,))
sentence(P, innocent) :- person(P), not punish(P).


% ----- Instance
person(gabriel).
person(clare).
% @removable
drive(gabriel).
% @removable
alcohol(gabriel).
% @removable
drive(clare).



#program asplain.
% @label("{} is resisting the authorities",(P,))
% @addable
resist(P):-person(P).