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