intros.
apply Prodeq_dec; auto.
Qed.
(*MyDir(o): parent directory of object o*)
Parameter MyDir : OBJNAME -> OBJECT.
Definition ObjName (o : OBJECT) : OBJNAME := fst o.
Definition ObjType (o : OBJECT) : OBJTYPE := snd o.
(*********************************************************************)
(*                  Security Policy Objects                          *)
(*********************************************************************)
(* (allowedTo a b): if a pattern-matches (PM) true, then read access is allowed; otherwise it isn' if b PM true, then write access is allowed; otherwise it isn't *)
Record RIGHTS : Set := allowedTo {read_right : bool; write_right : bool}.
(* (rwx o g a): if o PM (allowedTo x y) then the owner has or has't read and/or write access; if g PM (allowedTo x y) then group g has or has't read and/or write access; if a PM (allowedTo x y) then all the system subjects has or has't read and/or write access *)
Record PERMS : Set := rwx {ownerp : RIGHTS; groupp : RIGHTS; otherp : RIGHTS}.
(*Designated below*)
Record AccessCtrlListData : Set := acldata
{owner : SUBJECT;
group : GRPNAME;
UsersReaders : set SUBJECT;
GroupReaders : set GRPNAME;
UsersWriters : set SUBJECT;
GroupWriters : set GRPNAME;
UsersOwners : set SUBJECT;
GroupOwners : set GRPNAME}.
(*Designated below*)
Record ReadersWriters : Set := mkRW
{ActReaders : set SUBJECT; ActWriters : set SUBJECT}.

(* Specifications: *)
Axiom RWeq_dec : forall x1 x2 : ReadersWriters, {x1 = x2} + {x1 <> x2}.
Record SFSstate : Set := mkSFS
{groups : GRPNAME -> set SUBJECT;
primaryGrp : SUBJECT -> GRPNAME;
subjectSC : set (SUBJECT * SecClass);
AllGrp : GRPNAME;
RootGrp : GRPNAME;
SecAdmGrp : GRPNAME;
objectSC : set (OBJECT * SecClass);
acl : set (OBJECT * AccessCtrlListData);
secmat : set (OBJECT * ReadersWriters);
files : set (OBJECT * FILECONT);
directories : set (OBJECT * DIRCONT)}.