let simplifyDNFwrtCtx (dnf:Promelaast.condition list list) (f:string) (status:Promelaast.funcStatus) =
let rec simplCNFwrtCtx (cnf:Promelaast.condition list) =
match cnf with
| [] -> (True,[PTrue])
| PTrue::l -> simplCNFwrtCtx l
| PFalse::_ ->(False, [PFalse])
| PIndexedExp(s)::l ->
let (b,l2) = simplCNFwrtCtx l in
if b=False then (False, [PFalse])
else (Undefined,PIndexedExp(s)::l2)
| PCall(s)::l ->
if (String.compare f s)=0 && status=Promelaast.Call then
simplCNFwrtCtx l
else
(False, [PFalse])
| PReturn(s)::l ->
if (String.compare f s)=0 && status=Promelaast.Return then
simplCNFwrtCtx l
else
(False, [PFalse])
| PCallOrReturn(s)::l ->
if (String.compare f s)=0 then
simplCNFwrtCtx l
else
(False, [PFalse])
| PFuncReturn (hash, s)::l ->
if (String.compare f s)=0 && status=Promelaast.Return then
let (b,l2)= simplCNFwrtCtx l in
if b=False then
(False, [PFalse])
else
(Undefined,PFuncReturn(hash,s)::l2)
else
(False, [PFalse])
| PFuncParam (hash, s, vl)::l ->
if (String.compare f s)=0 && status=Promelaast.Call then
let (b,l2)= simplCNFwrtCtx l in
if b=False then
(False, [PFalse])
else
(Undefined,PFuncParam(hash,s,vl)::l2)
else
(False, [PFalse])
| PNot(c)::l ->
let (b1,l1) = simplCNFwrtCtx [c] in
if b1=True then (False, [PFalse])
else
if b1=False then simplCNFwrtCtx l
else
begin
let nl1 = PNot(List.hd l1) in
let (b2,l2) = simplCNFwrtCtx l in
if b2=False then (False, [PFalse])
else (Undefined,nl1::l2)
end
| PAnd (_,_) ::_
| POr (_,_)::_ -> assert false
in
List.fold_left
(fun res cll -> let (_,c) = simplCNFwrtCtx cll in
c::res)
[]
dnf