1.1 KiB
1.1 KiB
module Offices
type office = One | Two | Three
type person = Ana | Nuno | Pedro | Maria
predicate hasOffice (person) (office)
axiom A1 : forall p:person. exists o:office. hasOffice p o
axiom A2 : forall p:person, o1 o2 : office.
hasOffice p o1 /\ hasOffice p o2 -> o1 = o2
axiom B : forall o1 o2 : office. hasOffice Pedro o1 /\ hasOffice Nuno o2 ->
o1 <> o2
predicate alone (p:person) = forall o:office. forall p1:person.
(hasOffice p o) /\ hasOffice p1 o -> p = p1
axiom C : alone Ana -> alone Pedro
axiom D : forall p1 p2 p3: person, o:office.
hasOffice p1 o /\ hasOffice p2 o /\ hasOffice p3 o ->
p1 = p2 \/ p1 = p3 \/ p3 = p2
goal sanity_test : false (*check if the model makes sense*)
goal g1 : hasOffice Maria One -> alone Maria
goal g2 : forall o1:office. (hasOffice Ana o1 /\ hasOffice Nuno o1) ->
exists o2:office. hasOffice Pedro o2 /\ hasOffice Maria o2
predicate empty (o:office) = forall p:person. not (hasOffice p o)
lemma atMostOneEmpty : forall o1 o2: office. empty o1 /\ empty o2 ->
o1 = o2
end