[STATEMENT]
lemma InvariantEquivalentZLAfterInitialization:
fixes F0 :: Formula
shows
  "let state' = (initialize F0 initialState) in
   let F0' = (filter (\<lambda> c. \<not> clauseTautology c) F0) in
     (getSATFlag state' = UNDEF \<and> InvariantEquivalentZL (getF state') (getM state') F0') \<or>
     (getSATFlag state' = FALSE \<and> \<not> satisfiable F0')"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. let state' = initialize F0 initialState; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> InvariantEquivalentZL (getF state') (getM state') F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
using InvariantEquivalentZLAfterInitializationStep[of "initialState" "[]" "{}" "F0" "F0"]
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag initialState = UNDEF \<and> InvariantEquivalentZL (getF initialState) (getM initialState) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag initialState = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); InvariantConsistent (getM initialState); InvariantUniq (getM initialState); InvariantWatchListsContainOnlyClausesFromF (getWatchList initialState) (getF initialState); InvariantWatchListsUniq (getWatchList initialState); InvariantWatchListsCharacterization (getWatchList initialState) (getWatch1 initialState) (getWatch2 initialState); InvariantWatchesEl (getF initialState) (getWatch1 initialState) (getWatch2 initialState); InvariantWatchesDiffer (getF initialState) (getWatch1 initialState) (getWatch2 initialState); InvariantWatchCharacterization (getF initialState) (getWatch1 initialState) (getWatch2 initialState) (getM initialState); InvariantConflictFlagCharacterization (getConflictFlag initialState) (getF initialState) (getM initialState); InvariantConflictClauseCharacterization (getConflictFlag initialState) (getConflictClause initialState) (getF initialState) (getM initialState); InvariantQCharacterization (getConflictFlag initialState) (getQ initialState) (getF initialState) (getM initialState); InvariantNoDecisionsWhenConflict (getF initialState) (getM initialState) (currentLevel (getM initialState)); InvariantNoDecisionsWhenUnit (getF initialState) (getM initialState) (currentLevel (getM initialState)); InvariantGetReasonIsReason (getReason initialState) (getF initialState) (getM initialState) (set (getQ initialState)); InvariantUniqQ (getQ initialState); finite {}; InvariantVarsM (getM initialState) F0 {}; InvariantVarsQ (getQ initialState) F0 {}; InvariantVarsF (getF initialState) F0 {}; getConflictFlag initialState \<or> getQ initialState = []; currentLevel (getM initialState) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 initialState in getSATFlag state' = UNDEF \<and> InvariantEquivalentZL (getF state') (getM state') (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 initialState; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> InvariantEquivalentZL (getF state') (getM state') F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding initialState_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> InvariantEquivalentZL (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); InvariantConsistent (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantUniq (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsContainOnlyClausesFromF (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsUniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsCharacterization (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchesEl (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchesDiffer (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchCharacterization (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictFlagCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictClauseCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantQCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> InvariantEquivalentZL (getF state') (getM state') (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> InvariantEquivalentZL (getF state') (getM state') F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantEquivalentZL_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); InvariantConsistent (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantUniq (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsContainOnlyClausesFromF (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsUniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsCharacterization (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchesEl (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchesDiffer (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchCharacterization (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictFlagCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictClauseCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantQCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantConsistent_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniq (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsContainOnlyClausesFromF (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsUniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsCharacterization (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchesEl (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchesDiffer (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchCharacterization (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictFlagCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictClauseCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantQCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantUniq_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantWatchListsContainOnlyClausesFromF (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsUniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsCharacterization (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchesEl (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchesDiffer (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchCharacterization (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictFlagCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictClauseCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantQCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantWatchesEl_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantWatchListsContainOnlyClausesFromF (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsUniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsCharacterization (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); InvariantWatchesDiffer (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchCharacterization (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictFlagCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictClauseCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantQCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantWatchesDiffer_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantWatchListsContainOnlyClausesFromF (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsUniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsCharacterization (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; InvariantWatchCharacterization (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictFlagCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictClauseCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantQCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantWatchListsContainOnlyClausesFromF_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsUniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantWatchListsCharacterization (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; InvariantWatchCharacterization (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictFlagCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictClauseCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantQCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantWatchListsUniq_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); InvariantWatchListsCharacterization (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; InvariantWatchCharacterization (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictFlagCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictClauseCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantQCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantWatchListsCharacterization_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; InvariantWatchCharacterization (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictFlagCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictClauseCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantQCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantWatchCharacterization_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> watchCharacterizationCondition w1 w2 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c) \<and> watchCharacterizationCondition w2 w1 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c); InvariantConflictFlagCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantConflictClauseCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantQCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantConflictFlagCharacterization_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> watchCharacterizationCondition w1 w2 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c) \<and> watchCharacterizationCondition w2 w1 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantConflictClauseCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantQCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantConflictClauseCharacterization_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> watchCharacterizationCondition w1 w2 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c) \<and> watchCharacterizationCondition w2 w1 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantQCharacterization (getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantQCharacterization_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> watchCharacterizationCondition w1 w2 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c) \<and> watchCharacterizationCondition w2 w1 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<not> getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> (\<forall>l. l el getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = (\<exists>c. c el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause c l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))); InvariantNoDecisionsWhenConflict (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantNoDecisionsWhenConflict_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> watchCharacterizationCondition w1 w2 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c) \<and> watchCharacterizationCondition w2 w1 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<not> getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> (\<forall>l. l el getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = (\<exists>c. c el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause c l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<not> formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); InvariantNoDecisionsWhenUnit (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantNoDecisionsWhenUnit_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> watchCharacterizationCondition w1 w2 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c) \<and> watchCharacterizationCondition w2 w1 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<not> getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> (\<forall>l. l el getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = (\<exists>c. c el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause c l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<not> formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<nexists>clause literal. clause el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause clause literal (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); InvariantGetReasonIsReason (getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantGetReasonIsReason_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> watchCharacterizationCondition w1 w2 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c) \<and> watchCharacterizationCondition w2 w1 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<not> getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> (\<forall>l. l el getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = (\<exists>c. c el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause c l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<not> formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<nexists>clause literal. clause el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause clause literal (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>literal. (literal el elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> \<not> literal el decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> 0 < elementLevel literal (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> isReason (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) \<and> (0 < currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> literal \<in> set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> (isUnitClause (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))))); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; InvariantVarsM (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantVarsM_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> watchCharacterizationCondition w1 w2 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c) \<and> watchCharacterizationCondition w2 w1 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<not> getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> (\<forall>l. l el getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = (\<exists>c. c el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause c l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<not> formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<nexists>clause literal. clause el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause clause literal (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>literal. (literal el elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> \<not> literal el decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> 0 < elementLevel literal (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> isReason (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) \<and> (0 < currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> literal \<in> set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> (isUnitClause (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))))); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; vars (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<subseteq> vars F0 \<union> {}; InvariantVarsQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantVarsQ_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> watchCharacterizationCondition w1 w2 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c) \<and> watchCharacterizationCondition w2 w1 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<not> getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> (\<forall>l. l el getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = (\<exists>c. c el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause c l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<not> formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<nexists>clause literal. clause el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause clause literal (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>literal. (literal el elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> \<not> literal el decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> 0 < elementLevel literal (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> isReason (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) \<and> (0 < currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> literal \<in> set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> (isUnitClause (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))))); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; vars (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<subseteq> vars F0 \<union> {}; vars (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; InvariantVarsF (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) F0 {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantVarsF_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> watchCharacterizationCondition w1 w2 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c) \<and> watchCharacterizationCondition w2 w1 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<not> getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> (\<forall>l. l el getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = (\<exists>c. c el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause c l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<not> formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<nexists>clause literal. clause el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause clause literal (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>literal. (literal el elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> \<not> literal el decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> 0 < elementLevel literal (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> isReason (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) \<and> (0 < currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> literal \<in> set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> (isUnitClause (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))))); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; vars (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<subseteq> vars F0 \<union> {}; vars (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; vars (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding watchCharacterizationCondition_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> (literalFalse w1 (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<longrightarrow> (\<exists>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> literalTrue l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel l (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w1) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> (\<forall>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> l \<noteq> w1 \<and> l \<noteq> w2 \<longrightarrow> literalFalse l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel (opposite l) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w1) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))) \<and> (literalFalse w2 (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<longrightarrow> (\<exists>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> literalTrue l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel l (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w2) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> (\<forall>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> l \<noteq> w2 \<and> l \<noteq> w1 \<longrightarrow> literalFalse l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel (opposite l) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w2) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<not> getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> (\<forall>l. l el getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = (\<exists>c. c el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause c l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<not> formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<nexists>clause literal. clause el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause clause literal (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>literal. (literal el elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> \<not> literal el decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> 0 < elementLevel literal (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> isReason (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) \<and> (0 < currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> literal \<in> set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> (isUnitClause (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))))); InvariantUniqQ (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; vars (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<subseteq> vars F0 \<union> {}; vars (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; vars (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding InvariantUniqQ_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel 0 (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> (literalFalse w1 (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<longrightarrow> (\<exists>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> literalTrue l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel l (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w1) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> (\<forall>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> l \<noteq> w1 \<and> l \<noteq> w2 \<longrightarrow> literalFalse l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel (opposite l) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w1) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))) \<and> (literalFalse w2 (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<longrightarrow> (\<exists>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> literalTrue l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel l (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w2) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> (\<forall>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> l \<noteq> w2 \<and> l \<noteq> w1 \<longrightarrow> literalFalse l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel (opposite l) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w2) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<not> getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> (\<forall>l. l el getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = (\<exists>c. c el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause c l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<not> formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<nexists>clause literal. clause el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause clause literal (elements (prefixToLevel level' (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); \<forall>literal. (literal el elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> \<not> literal el decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> 0 < elementLevel literal (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> isReason (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) \<and> (0 < currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> literal \<in> set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> (isUnitClause (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))))); uniq (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; vars (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<subseteq> vars F0 \<union> {}; vars (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; vars (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel 0 (getM state')))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding prefixToLevel_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> equivalentFormulae (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel_aux (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) 0 0))) (filter (\<lambda>c. \<not> clauseTautology c) []) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> (literalFalse w1 (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<longrightarrow> (\<exists>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> literalTrue l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel l (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w1) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> (\<forall>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> l \<noteq> w1 \<and> l \<noteq> w2 \<longrightarrow> literalFalse l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel (opposite l) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w1) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))) \<and> (literalFalse w2 (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<longrightarrow> (\<exists>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> literalTrue l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel l (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w2) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> (\<forall>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> l \<noteq> w2 \<and> l \<noteq> w1 \<longrightarrow> literalFalse l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel (opposite l) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w2) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<not> getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> (\<forall>l. l el getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = (\<exists>c. c el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause c l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<not> formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (prefixToLevel_aux (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) level' 0)); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<nexists>clause literal. clause el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause clause literal (elements (prefixToLevel_aux (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) level' 0)); \<forall>literal. (literal el elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> \<not> literal el decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> 0 < elementLevel literal (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> isReason (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) \<and> (0 < currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> literal \<in> set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> (isUnitClause (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))))); uniq (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; vars (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<subseteq> vars F0 \<union> {}; vars (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; vars (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel_aux (getM state') 0 0))) (filter (\<lambda>c. \<not> clauseTautology c) F0) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> equivalentFormulae (getF state' @ val2form (elements (prefixToLevel_aux (getM state') 0 0))) F0' \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding equivalentFormulae_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> (\<forall>valuation. model valuation (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel_aux (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) 0 0))) = model valuation (filter (\<lambda>c. \<not> clauseTautology c) [])) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> (literalFalse w1 (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<longrightarrow> (\<exists>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> literalTrue l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel l (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w1) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> (\<forall>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> l \<noteq> w1 \<and> l \<noteq> w2 \<longrightarrow> literalFalse l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel (opposite l) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w1) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))) \<and> (literalFalse w2 (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<longrightarrow> (\<exists>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> literalTrue l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel l (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w2) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> (\<forall>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> l \<noteq> w2 \<and> l \<noteq> w1 \<longrightarrow> literalFalse l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel (opposite l) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w2) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<not> getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> (\<forall>l. l el getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = (\<exists>c. c el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause c l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<not> formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (prefixToLevel_aux (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) level' 0)); \<forall>level'<currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>). \<nexists>clause literal. clause el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause clause literal (elements (prefixToLevel_aux (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) level' 0)); \<forall>literal. (literal el elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> \<not> literal el decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> 0 < elementLevel literal (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> isReason (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) \<and> (0 < currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> literal \<in> set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> (isUnitClause (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))))); uniq (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; vars (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<subseteq> vars F0 \<union> {}; vars (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; vars (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; currentLevel (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> (\<forall>valuation. model valuation (getF state' @ val2form (elements (prefixToLevel_aux (getM state') 0 0))) = model valuation (filter (\<lambda>c. \<not> clauseTautology c) F0)) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> (\<forall>valuation. model valuation (getF state' @ val2form (elements (prefixToLevel_aux (getM state') 0 0))) = model valuation F0') \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
unfolding currentLevel_def
[PROOF STATE]
proof (prove)
using this:
\<lbrakk>getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = UNDEF \<and> (\<forall>valuation. model valuation (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> @ val2form (elements (prefixToLevel_aux (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) 0 0))) = model valuation (filter (\<lambda>c. \<not> clauseTautology c) [])) \<or> getSATFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) []); consistent (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); uniq (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<forall>l c. c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l) \<longrightarrow> 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); \<forall>l. uniq (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l); \<forall>c l. (c \<in> set (getWatchList \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> l)) = (Some l = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<or> Some l = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>w1 w2. getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w1 \<and> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause = Some w2 \<and> w1 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause \<and> w2 el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! clause); \<forall>clause. 0 \<le> clause \<and> clause < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause \<noteq> getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> clause; \<forall>c w1 w2. 0 \<le> c \<and> c < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> Some w1 = getWatch1 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<and> Some w2 = getWatch2 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> c \<longrightarrow> (literalFalse w1 (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<longrightarrow> (\<exists>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> literalTrue l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel l (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w1) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> (\<forall>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> l \<noteq> w1 \<and> l \<noteq> w2 \<longrightarrow> literalFalse l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel (opposite l) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w1) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))) \<and> (literalFalse w2 (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<longrightarrow> (\<exists>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> literalTrue l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel l (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w2) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> (\<forall>l. l el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! c \<and> l \<noteq> w2 \<and> l \<noteq> w1 \<longrightarrow> literalFalse l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> elementLevel (opposite l) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<le> elementLevel (opposite w2) (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! getConflictClause \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)); \<not> getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<longrightarrow> (\<forall>l. l el getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = (\<exists>c. c el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause c l (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))); \<forall>level'<length (decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)). \<not> formulaFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) (elements (prefixToLevel_aux (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) level' 0)); \<forall>level'<length (decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)). \<nexists>clause literal. clause el getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<and> isUnitClause clause literal (elements (prefixToLevel_aux (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) level' 0)); \<forall>literal. (literal el elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> \<not> literal el decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> 0 < elementLevel literal (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> isReason (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)))) \<and> (0 < length (decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<and> literal \<in> set (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<longrightarrow> (\<exists>reason. getReason \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> literal = Some reason \<and> 0 \<le> reason \<and> reason < length (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<and> (isUnitClause (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) literal (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<or> clauseFalse (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> ! reason) (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>))))); uniq (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>); finite {}; vars (elements (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) \<subseteq> vars F0 \<union> {}; vars (getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; vars (getF \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>) \<subseteq> vars F0 \<union> {}; getConflictFlag \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> \<or> getQ \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> = []; length (decisions (getM \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>)) = 0; F0 = [] @ F0\<rbrakk> \<Longrightarrow> let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr> in getSATFlag state' = UNDEF \<and> (\<forall>valuation. model valuation (getF state' @ val2form (elements (prefixToLevel_aux (getM state') 0 0))) = model valuation (filter (\<lambda>c. \<not> clauseTautology c) F0)) \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable (filter (\<lambda>c. \<not> clauseTautology c) F0)

goal (1 subgoal):
 1. let state' = initialize F0 \<lparr>getSATFlag = UNDEF, getF = [], getM = [], getConflictFlag = False, getConflictClause = 0, getQ = [], getReason = Map.empty, getWatch1 = Map.empty, getWatch2 = Map.empty, getWatchList = \<lambda>l. [], getC = [], getCl = Pos 0, getCll = Pos 0, getCn = 0\<rparr>; F0' = filter (\<lambda>c. \<not> clauseTautology c) F0 in getSATFlag state' = UNDEF \<and> (\<forall>valuation. model valuation (getF state' @ val2form (elements (prefixToLevel_aux (getM state') 0 0))) = model valuation F0') \<or> getSATFlag state' = FALSE \<and> \<not> satisfiable F0'
[PROOF STEP]
by (auto simp add: Let_def)