src/HOL/Imperative_HOL/ex/SatChecker.thy
author haftmann
Thu, 29 Apr 2010 15:00:41 +0200
changeset 36533 f8df589ca2a5
parent 36147 b43b22f63665
child 37456 0a1cc2675958
permissions -rw-r--r--
dropped unnecessary ML code
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36098
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
     1
(*  Title:      HOL/Imperative_HOL/ex/SatChecker.thy
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
     2
    Author:     Lukas Bulwahn, TU Muenchen
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
     3
*)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
     4
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
     5
header {* An efficient checker for proofs from a SAT solver *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
     6
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
     7
theory SatChecker
36147
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 36098
diff changeset
     8
imports RBT_Impl Sorted_List "~~/src/HOL/Imperative_HOL/Imperative_HOL" 
36098
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
     9
begin
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    10
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    11
section{* General settings and functions for our representation of clauses *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    12
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    13
subsection{* Types for Literals, Clauses and ProofSteps *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    14
text {* We encode Literals as integers and Clauses as sorted Lists. *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    15
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    16
types ClauseId = nat
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    17
types Lit = int
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    18
types Clause = "Lit list"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    19
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    20
text {* This resembles exactly to Isat's Proof Steps *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    21
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    22
types Resolvants = "ClauseId * (Lit * ClauseId) list"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    23
datatype ProofStep =
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    24
  ProofDone bool
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    25
  | Root ClauseId Clause
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    26
  | Conflict ClauseId Resolvants
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    27
  | Delete ClauseId
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    28
  | Xstep ClauseId ClauseId
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    29
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    30
subsection{* Interpretation of Literals, Clauses, and an array of Clauses *} 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    31
text {* Specific definitions for Literals as integers *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    32
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    33
definition compl :: "Lit \<Rightarrow> Lit"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    34
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    35
  "compl a = -a"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    36
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    37
definition interpLit :: "(nat \<Rightarrow> bool) \<Rightarrow> Lit \<Rightarrow> bool"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    38
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    39
  "interpLit assgnmt lit = (if lit > 0 then assgnmt (nat lit) else (if (lit < 0) then \<not> (assgnmt (nat (- lit))) else undefined))"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    40
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    41
lemma interpLit_compl[simp]:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    42
  assumes lit_not_zero: "lit \<noteq> 0"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    43
  shows "interpLit a (compl lit) = (\<not> interpLit a lit)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    44
unfolding interpLit_def compl_def using lit_not_zero by auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    45
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    46
lemma compl_compl_is_id[simp]:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    47
  "compl (compl x) = x"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    48
unfolding compl_def by simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    49
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    50
lemma compl_not_zero[simp]:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    51
  "(compl x \<noteq> 0) = (x \<noteq> 0)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    52
unfolding compl_def by simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    53
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    54
lemma compl_exists: "\<exists>l'. l = compl l'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    55
unfolding compl_def by arith
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    56
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    57
text {* Specific definitions for Clauses as sorted lists *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    58
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    59
definition interpClause :: "(nat \<Rightarrow> bool) \<Rightarrow> Clause \<Rightarrow> bool"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    60
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    61
  "interpClause assgnmt cl = (\<exists> l \<in> set cl. interpLit assgnmt l)" 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    62
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    63
lemma interpClause_empty[simp]:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    64
  "interpClause a [] = False" 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    65
unfolding interpClause_def by simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    66
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    67
lemma interpClause_sort[simp]: "interpClause a (sort clause) = interpClause a clause"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    68
unfolding interpClause_def
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    69
by simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    70
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    71
lemma interpClause_remdups[simp]: "interpClause a (remdups clause) = interpClause a clause"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    72
unfolding interpClause_def
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    73
by simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    74
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    75
definition 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    76
  "inconsistent cs = (\<forall>a.\<exists>c\<in>set cs. \<not> interpClause a c)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    77
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    78
lemma interpClause_resolvants':
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    79
  assumes lit_not_zero: "lit \<noteq> 0"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    80
  assumes resolv_clauses: "lit \<in> cli" "compl lit \<in> clj"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    81
  assumes interp: "\<exists>x \<in> cli. interpLit a x" "\<exists>x \<in> clj. interpLit a x"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    82
  shows "\<exists>x \<in> (cli - {lit} \<union> (clj - {compl lit})). interpLit a x"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    83
proof -
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    84
  from resolv_clauses interp have "(\<exists>l \<in> cli - {lit}. interpLit a l) \<or> interpLit a lit"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    85
    "(\<exists>l \<in> clj - {compl lit}. interpLit a l) \<or> interpLit a (compl lit)" by auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    86
  with lit_not_zero show ?thesis by (fastsimp simp add: bex_Un)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    87
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    88
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    89
lemma interpClause_resolvants:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    90
  assumes lit_not_zero: "lit \<noteq> 0"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    91
  assumes sorted_and_distinct: "sorted cli" "distinct cli" "sorted clj" "distinct clj"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    92
  assumes resolv_clauses: "lit \<in> set cli" "compl lit \<in> set clj"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    93
  assumes interp: "interpClause a cli" "interpClause a clj"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    94
  shows "interpClause a (merge (remove lit cli) (remove (compl lit) clj))"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    95
proof -
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    96
  from lit_not_zero resolv_clauses interp sorted_and_distinct show ?thesis
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    97
    unfolding interpClause_def
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    98
    using interpClause_resolvants' by simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
    99
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   100
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   101
definition correctClause :: "Clause list \<Rightarrow> Clause \<Rightarrow> bool"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   102
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   103
  "correctClause rootcls cl = (\<forall>a. (\<forall>rcl \<in> set rootcls. interpClause a rcl) \<longrightarrow> (interpClause a cl))"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   104
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   105
lemma correctClause_resolvants:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   106
  assumes lit_not_zero: "lit \<noteq> 0"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   107
  assumes sorted_and_distinct: "sorted cli" "distinct cli" "sorted clj" "distinct clj"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   108
  assumes resolv_clauses: "lit \<in> set cli" "compl lit \<in> set clj"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   109
  assumes correct: "correctClause r cli" "correctClause r clj"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   110
  shows "correctClause r (merge (remove lit cli) (remove (compl lit) clj))"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   111
  using assms interpClause_resolvants unfolding correctClause_def by auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   112
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   113
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   114
lemma implies_empty_inconsistent: 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   115
  "correctClause cs [] \<Longrightarrow> inconsistent cs"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   116
unfolding inconsistent_def correctClause_def
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   117
by auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   118
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   119
text {* Specific definition for derived clauses in the Array *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   120
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   121
definition correctArray :: "Clause list \<Rightarrow> Clause option array \<Rightarrow> heap \<Rightarrow> bool"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   122
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   123
  "correctArray rootcls a h =
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   124
  (\<forall>cl \<in> array_ran a h. correctClause rootcls cl \<and> sorted cl \<and> distinct cl)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   125
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   126
lemma correctArray_update:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   127
  assumes "correctArray rcs a h"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   128
  assumes "correctClause rcs c" "sorted c" "distinct c"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   129
  shows "correctArray rcs a (Heap.upd a i (Some c) h)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   130
  using assms
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   131
  unfolding correctArray_def
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   132
  by (auto dest:array_ran_upd_array_Some)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   133
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   134
lemma correctClause_mono:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   135
  assumes "correctClause rcs c"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   136
  assumes "set rcs \<subseteq> set rcs'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   137
  shows "correctClause rcs' c"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   138
  using assms unfolding correctClause_def
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   139
  by auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   140
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   141
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   142
section{* Improved version of SatChecker *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   143
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   144
text{* This version just uses a single list traversal. *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   145
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   146
subsection{* Function definitions *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   147
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   148
fun res_mem :: "Lit \<Rightarrow> Clause \<Rightarrow> Clause Heap"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   149
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   150
  "res_mem l [] = raise ''MiniSatChecked.res_thm: Cannot find literal''"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   151
| "res_mem l (x#xs) = (if (x = l) then return xs else (do v \<leftarrow> res_mem l xs; return (x # v) done))"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   152
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   153
fun resolve1 :: "Lit \<Rightarrow> Clause \<Rightarrow> Clause \<Rightarrow> Clause Heap"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   154
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   155
  "resolve1 l (x#xs) (y#ys) =
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   156
  (if (x = l) then return (merge xs (y#ys))
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   157
  else (if (x < y) then (do v \<leftarrow> resolve1 l xs (y#ys); return (x # v) done)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   158
  else (if (x > y) then (do v \<leftarrow> resolve1 l (x#xs) ys; return (y # v) done)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   159
  else (do v \<leftarrow> resolve1 l xs ys; return (x # v) done))))"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   160
| "resolve1 l [] ys = raise ''MiniSatChecked.res_thm: Cannot find literal''"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   161
| "resolve1 l xs [] = res_mem l xs"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   162
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   163
fun resolve2 :: "Lit \<Rightarrow> Clause \<Rightarrow> Clause \<Rightarrow> Clause Heap" 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   164
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   165
  "resolve2 l (x#xs) (y#ys) =
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   166
  (if (y = l) then return (merge (x#xs) ys)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   167
  else (if (x < y) then (do v \<leftarrow> resolve2 l xs (y#ys); return (x # v) done)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   168
  else (if (x > y) then (do v \<leftarrow> resolve2 l (x#xs) ys; return (y # v) done) 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   169
  else (do v \<leftarrow> resolve2 l xs ys; return (x # v) done))))"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   170
  | "resolve2 l xs [] = raise ''MiniSatChecked.res_thm: Cannot find literal''"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   171
  | "resolve2 l [] ys = res_mem l ys"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   172
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   173
fun res_thm' :: "Lit \<Rightarrow> Clause \<Rightarrow> Clause \<Rightarrow> Clause Heap"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   174
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   175
  "res_thm' l (x#xs) (y#ys) = 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   176
  (if (x = l \<or> x = compl l) then resolve2 (compl x) xs (y#ys)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   177
  else (if (y = l \<or> y = compl l) then resolve1 (compl y) (x#xs) ys
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   178
  else (if (x < y) then (res_thm' l xs (y#ys)) \<guillemotright>= (\<lambda>v. return (x # v))
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   179
  else (if (x > y) then (res_thm' l (x#xs) ys) \<guillemotright>= (\<lambda>v. return (y # v))
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   180
  else (res_thm' l xs ys) \<guillemotright>= (\<lambda>v. return (x # v))))))"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   181
| "res_thm' l [] ys = raise (''MiniSatChecked.res_thm: Cannot find literal'')"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   182
| "res_thm' l xs [] = raise (''MiniSatChecked.res_thm: Cannot find literal'')"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   183
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   184
declare res_mem.simps [simp del] resolve1.simps [simp del] resolve2.simps [simp del] res_thm'.simps [simp del]
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   185
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   186
subsection {* Proofs about these functions *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   187
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   188
lemma res_mem:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   189
assumes "crel (res_mem l xs) h h' r"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   190
  shows "l \<in> set xs \<and> r = remove1 l xs"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   191
using assms
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   192
proof (induct xs arbitrary: r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   193
  case Nil
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   194
  thus ?case unfolding res_mem.simps by (auto elim: crel_raise)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   195
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   196
  case (Cons x xs')
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   197
  thus ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   198
    unfolding res_mem.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   199
    by (elim crel_raise crel_return crel_if crelE) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   200
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   201
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   202
lemma resolve1_Inv:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   203
assumes "crel (resolve1 l xs ys) h h' r"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   204
  shows "l \<in> set xs \<and> r = merge (remove1 l xs) ys"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   205
using assms
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   206
proof (induct xs ys arbitrary: r rule: resolve1.induct)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   207
  case (1 l x xs y ys r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   208
  thus ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   209
    unfolding resolve1.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   210
    by (elim crelE crel_if crel_return) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   211
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   212
  case (2 l ys r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   213
  thus ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   214
    unfolding resolve1.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   215
    by (elim crel_raise) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   216
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   217
  case (3 l v va r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   218
  thus ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   219
    unfolding resolve1.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   220
    by (fastsimp dest!: res_mem)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   221
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   222
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   223
lemma resolve2_Inv: 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   224
  assumes "crel (resolve2 l xs ys) h h' r"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   225
  shows "l \<in> set ys \<and> r = merge xs (remove1 l ys)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   226
using assms
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   227
proof (induct xs ys arbitrary: r rule: resolve2.induct)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   228
  case (1 l x xs y ys r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   229
  thus ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   230
    unfolding resolve2.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   231
    by (elim crelE crel_if crel_return) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   232
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   233
  case (2 l ys r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   234
  thus ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   235
    unfolding resolve2.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   236
    by (elim crel_raise) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   237
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   238
  case (3 l v va r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   239
  thus ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   240
    unfolding resolve2.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   241
    by (fastsimp dest!: res_mem simp add: merge_Nil)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   242
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   243
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   244
lemma res_thm'_Inv:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   245
assumes "crel (res_thm' l xs ys) h h' r"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   246
shows "\<exists>l'. (l' \<in> set xs \<and> compl l' \<in> set ys \<and> (l' = compl l \<or> l' = l)) \<and> r = merge (remove1 l' xs) (remove1 (compl l') ys)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   247
using assms
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   248
proof (induct xs ys arbitrary: r rule: res_thm'.induct)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   249
case (1 l x xs y ys r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   250
(* There are five cases for res_thm: We will consider them one after another: *) 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   251
  {
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   252
    assume cond: "x = l \<or> x = compl l"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   253
    assume resolve2: "crel (resolve2 (compl x) xs (y # ys)) h h' r"   
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   254
    from resolve2_Inv [OF resolve2] cond have ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   255
      apply -
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   256
      by (rule exI[of _ "x"]) fastsimp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   257
  } moreover
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   258
  {
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   259
    assume cond: "\<not> (x = l \<or> x = compl l)" "y = l \<or> y = compl l" 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   260
    assume resolve1: "crel (resolve1 (compl y) (x # xs) ys) h h' r"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   261
    from resolve1_Inv [OF resolve1] cond have ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   262
      apply -
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   263
      by (rule exI[of _ "compl y"]) fastsimp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   264
  } moreover
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   265
  {
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   266
    fix r'
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   267
    assume cond: "\<not> (x = l \<or> x = compl l)" "\<not> (y = l \<or> y = compl l)" "x < y"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   268
    assume res_thm: "crel (res_thm' l xs (y # ys)) h h' r'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   269
    assume return: "r = x # r'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   270
    from "1.hyps"(1) [OF cond res_thm] cond return have ?case by auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   271
  } moreover
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   272
  {
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   273
    fix r'
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   274
    assume cond: "\<not> (x = l \<or> x = compl l)" "\<not> (y = l \<or> y = compl l)" "\<not> x < y" "y < x"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   275
    assume res_thm: "crel (res_thm' l (x # xs) ys) h h' r'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   276
    assume return: "r = y # r'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   277
    from "1.hyps"(2) [OF cond res_thm] cond return have ?case by auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   278
  } moreover
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   279
  {
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   280
    fix r'
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   281
    assume cond: "\<not> (x = l \<or> x = compl l)" "\<not> (y = l \<or> y = compl l)" "\<not> x < y" "\<not> y < x"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   282
    assume res_thm: "crel (res_thm' l xs ys) h h' r'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   283
    assume return: "r = x # r'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   284
    from "1.hyps"(3) [OF cond res_thm] cond return have ?case by auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   285
  } moreover
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   286
  note "1.prems"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   287
  ultimately show ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   288
    unfolding res_thm'.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   289
    apply (elim crelE crel_if crel_return)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   290
    apply simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   291
    apply simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   292
    apply simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   293
    apply simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   294
    apply fastsimp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   295
    done
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   296
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   297
  case (2 l ys r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   298
  thus ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   299
    unfolding res_thm'.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   300
    by (elim crel_raise) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   301
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   302
  case (3 l v va r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   303
  thus ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   304
    unfolding res_thm'.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   305
    by (elim crel_raise) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   306
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   307
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   308
lemma res_mem_no_heap:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   309
assumes "crel (res_mem l xs) h h' r"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   310
  shows "h = h'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   311
using assms
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   312
apply (induct xs arbitrary: r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   313
unfolding res_mem.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   314
apply (elim crel_raise)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   315
apply auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   316
apply (elim crel_if crelE crel_raise crel_return)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   317
apply auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   318
done
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   319
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   320
lemma resolve1_no_heap:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   321
assumes "crel (resolve1 l xs ys) h h' r"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   322
  shows "h = h'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   323
using assms
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   324
apply (induct xs ys arbitrary: r rule: resolve1.induct)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   325
unfolding resolve1.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   326
apply (elim crelE crel_if crel_return crel_raise)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   327
apply (auto simp add: res_mem_no_heap)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   328
by (elim crel_raise) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   329
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   330
lemma resolve2_no_heap:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   331
assumes "crel (resolve2 l xs ys) h h' r"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   332
  shows "h = h'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   333
using assms
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   334
apply (induct xs ys arbitrary: r rule: resolve2.induct)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   335
unfolding resolve2.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   336
apply (elim crelE crel_if crel_return crel_raise)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   337
apply (auto simp add: res_mem_no_heap)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   338
by (elim crel_raise) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   339
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   340
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   341
lemma res_thm'_no_heap:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   342
  assumes "crel (res_thm' l xs ys) h h' r"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   343
  shows "h = h'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   344
  using assms
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   345
proof (induct xs ys arbitrary: r rule: res_thm'.induct)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   346
  case (1 l x xs y ys r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   347
  thus ?thesis
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   348
    unfolding res_thm'.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   349
    by (elim crelE crel_if crel_return)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   350
  (auto simp add: resolve1_no_heap resolve2_no_heap)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   351
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   352
  case (2 l ys r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   353
  thus ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   354
    unfolding res_thm'.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   355
    by (elim crel_raise) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   356
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   357
  case (3 l v va r)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   358
  thus ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   359
    unfolding res_thm'.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   360
    by (elim crel_raise) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   361
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   362
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   363
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   364
lemma res_thm'_Inv2:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   365
  assumes res_thm: "crel (res_thm' l xs ys) h h' rcl"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   366
  assumes l_not_null: "l \<noteq> 0"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   367
  assumes ys: "correctClause r ys \<and> sorted ys \<and> distinct ys"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   368
  assumes xs: "correctClause r xs \<and> sorted xs \<and> distinct xs"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   369
  shows "correctClause r rcl \<and> sorted rcl \<and> distinct rcl"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   370
proof -
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   371
  from res_thm'_Inv [OF res_thm] xs ys l_not_null show ?thesis
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   372
    apply (auto simp add: sorted_remove1)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   373
    unfolding correctClause_def
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   374
    apply (auto simp add: remove1_eq_remove)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   375
    prefer 2
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   376
    apply (rule interpClause_resolvants)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   377
    apply simp_all
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   378
    apply (insert compl_exists [of l])
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   379
    apply auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   380
    apply (rule interpClause_resolvants)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   381
    apply simp_all
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   382
    done
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   383
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   384
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   385
subsection {* res_thm and doProofStep *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   386
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   387
definition get_clause :: "Clause option array \<Rightarrow> ClauseId \<Rightarrow> Clause Heap"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   388
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   389
  "get_clause a i = 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   390
       (do c \<leftarrow> nth a i;
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   391
           (case c of None \<Rightarrow> raise (''Clause not found'')
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   392
                    | Some x \<Rightarrow> return x)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   393
        done)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   394
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   395
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   396
fun res_thm2 :: "Clause option array \<Rightarrow> (Lit * ClauseId) \<Rightarrow> Clause \<Rightarrow> Clause Heap"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   397
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   398
  "res_thm2 a (l, j) cli =
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   399
  ( if l = 0 then raise(''Illegal literal'')
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   400
    else
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   401
     (do clj \<leftarrow> get_clause a j;
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   402
         res_thm' l cli clj
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   403
      done))"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   404
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   405
fun doProofStep2 :: "Clause option array \<Rightarrow> ProofStep \<Rightarrow> Clause list \<Rightarrow> Clause list Heap"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   406
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   407
  "doProofStep2 a (Conflict saveTo (i, rs)) rcs =
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   408
  (do
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   409
     cli \<leftarrow> get_clause a i;
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   410
     result \<leftarrow> foldM (res_thm2 a) rs cli;
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   411
     upd saveTo (Some result) a; 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   412
     return rcs
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   413
   done)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   414
| "doProofStep2 a (Delete cid) rcs = (do upd cid None a; return rcs done)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   415
| "doProofStep2 a (Root cid clause) rcs = (do upd cid (Some (remdups (sort clause))) a; return (clause # rcs) done)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   416
| "doProofStep2 a (Xstep cid1 cid2) rcs = raise ''MiniSatChecked.doProofStep: Xstep constructor found.''"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   417
| "doProofStep2 a (ProofDone b) rcs = raise ''MiniSatChecked.doProofStep: ProofDone constructor found.''"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   418
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   419
definition checker :: "nat \<Rightarrow> ProofStep list \<Rightarrow> nat \<Rightarrow> Clause list Heap"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   420
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   421
  "checker n p i =
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   422
  (do 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   423
     a \<leftarrow> Array.new n None;
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   424
     rcs \<leftarrow> foldM (doProofStep2 a) p [];
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   425
     ec \<leftarrow> Array.nth a i;
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   426
     (if ec = Some [] then return rcs 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   427
                else raise(''No empty clause''))
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   428
   done)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   429
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   430
lemma res_thm2_Inv:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   431
  assumes res_thm: "crel (res_thm2 a (l, j) cli) h h' rs"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   432
  assumes correct_a: "correctArray r a h"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   433
  assumes correct_cli: "correctClause r cli \<and> sorted cli \<and> distinct cli"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   434
  shows "h = h' \<and> correctClause r rs \<and> sorted rs \<and> distinct rs"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   435
proof -
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   436
  from res_thm have l_not_zero: "l \<noteq> 0" 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   437
    by (auto elim: crel_raise)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   438
  {
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   439
    fix clj
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   440
    let ?rs = "merge (remove l cli) (remove (compl l) clj)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   441
    let ?rs' = "merge (remove (compl l) cli) (remove l clj)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   442
    assume "h = h'" "Some clj = get_array a h' ! j" "j < Heap.length a h'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   443
    with correct_a have clj: "correctClause r clj" "sorted clj" "distinct clj"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   444
      unfolding correctArray_def by (auto intro: array_ranI)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   445
    with clj l_not_zero correct_cli
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   446
    have "(l \<in> set cli \<and> compl l \<in> set clj
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   447
      \<longrightarrow> correctClause r ?rs \<and> sorted ?rs \<and> distinct ?rs) \<and>
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   448
      (compl l \<in> set cli \<and> l \<in> set clj
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   449
      \<longrightarrow> correctClause r ?rs' \<and> sorted ?rs' \<and> distinct ?rs')"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   450
      apply (auto intro!: correctClause_resolvants)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   451
      apply (insert compl_exists [of l])
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   452
      by (auto intro!: correctClause_resolvants)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   453
  }
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   454
  {
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   455
    fix v clj
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   456
    assume "Some clj = get_array a h ! j" "j < Heap.length a h"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   457
    with correct_a have clj: "correctClause r clj \<and> sorted clj \<and> distinct clj"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   458
      unfolding correctArray_def by (auto intro: array_ranI)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   459
    assume "crel (res_thm' l cli clj) h h' rs"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   460
    from res_thm'_no_heap[OF this] res_thm'_Inv2[OF this l_not_zero clj correct_cli]
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   461
    have "h = h' \<and> correctClause r rs \<and> sorted rs \<and> distinct rs" by simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   462
  }
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   463
  with assms show ?thesis
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   464
    unfolding res_thm2.simps get_clause_def
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   465
    by (elim crelE crelE' crel_if crel_nth crel_raise crel_return crel_option_case) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   466
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   467
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   468
lemma foldM_Inv2:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   469
  assumes "crel (foldM (res_thm2 a) rs cli) h h' rcl"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   470
  assumes correct_a: "correctArray r a h"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   471
  assumes correct_cli: "correctClause r cli \<and> sorted cli \<and> distinct cli"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   472
  shows "h = h' \<and> correctClause r rcl \<and> sorted rcl \<and> distinct rcl"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   473
using assms
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   474
proof (induct rs arbitrary: h h' cli)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   475
  case Nil thus ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   476
    unfolding foldM.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   477
    by (elim crel_return) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   478
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   479
  case (Cons x xs)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   480
  {
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   481
    fix h1 ret
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   482
    obtain l j where x_is: "x = (l, j)" by fastsimp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   483
    assume res_thm2: "crel (res_thm2 a x cli) h h1 ret"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   484
    with x_is have res_thm2': "crel (res_thm2 a (l, j) cli) h h1 ret" by simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   485
    note step = res_thm2_Inv [OF res_thm2' Cons.prems(2) Cons.prems(3)]
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   486
    from step have ret: "correctClause r ret \<and> sorted ret \<and> distinct ret" by simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   487
    from step Cons.prems(2) have correct_a: "correctArray r a h1"  by simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   488
    assume foldM: "crel (foldM (res_thm2 a) xs ret) h1 h' rcl"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   489
    from step Cons.hyps [OF foldM correct_a ret] have
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   490
    "h = h' \<and> correctClause r rcl \<and> sorted rcl \<and> distinct rcl" by auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   491
  }
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   492
  with Cons show ?case
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   493
    unfolding foldM.simps
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   494
    by (elim crelE) auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   495
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   496
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   497
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   498
lemma step_correct2:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   499
  assumes crel: "crel (doProofStep2 a step rcs) h h' res"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   500
  assumes correctArray: "correctArray rcs a h"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   501
  shows "correctArray res a h'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   502
proof (cases "(a,step,rcs)" rule: doProofStep2.cases)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   503
  case (1 a saveTo i rs rcs)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   504
  with crel correctArray
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   505
  show ?thesis
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   506
    apply auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   507
    apply (auto simp: get_clause_def elim!: crelE crel_nth)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   508
    apply (auto elim!: crelE crel_nth crel_option_case crel_raise 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   509
      crel_return crel_upd)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   510
    apply (frule foldM_Inv2)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   511
    apply assumption
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   512
    apply (simp add: correctArray_def)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   513
    apply (drule_tac x="y" in bspec)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   514
    apply (rule array_ranI[where i=i])
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   515
    by (auto intro: correctArray_update)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   516
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   517
  case (2 a cid rcs)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   518
  with crel correctArray
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   519
  show ?thesis
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   520
    by (auto simp: correctArray_def elim!: crelE crel_upd crel_return
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   521
     dest: array_ran_upd_array_None)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   522
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   523
  case (3 a cid c rcs)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   524
  with crel correctArray
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   525
  show ?thesis
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   526
    apply (auto elim!: crelE crel_upd crel_return)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   527
    apply (auto simp: correctArray_def dest!: array_ran_upd_array_Some)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   528
    apply (auto intro: correctClause_mono)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   529
    by (auto simp: correctClause_def)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   530
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   531
  case 4
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   532
  with crel correctArray
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   533
  show ?thesis by (auto elim: crel_raise)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   534
next
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   535
  case 5
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   536
  with crel correctArray
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   537
  show ?thesis by (auto elim: crel_raise)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   538
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   539
  
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   540
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   541
theorem fold_steps_correct:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   542
  assumes "crel (foldM (doProofStep2 a) steps rcs) h h' res"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   543
  assumes "correctArray rcs a h"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   544
  shows "correctArray res a h'"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   545
using assms
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   546
by (induct steps arbitrary: rcs h h' res)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   547
 (auto elim!: crelE crel_return dest:step_correct2)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   548
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   549
theorem checker_soundness:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   550
  assumes "crel (checker n p i) h h' cs"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   551
  shows "inconsistent cs"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   552
using assms unfolding checker_def
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   553
apply (elim crelE crel_nth crel_if crel_return crel_raise crel_new_weak)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   554
prefer 2 apply simp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   555
apply auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   556
apply (drule fold_steps_correct)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   557
apply (simp add: correctArray_def array_ran_def)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   558
apply (cases "n = 0", auto)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   559
apply (rule implies_empty_inconsistent)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   560
apply (simp add:correctArray_def)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   561
apply (drule bspec)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   562
by (rule array_ranI, auto)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   563
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   564
section {* Functional version with Lists as Array *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   565
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   566
subsection {* List specific definitions *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   567
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   568
definition list_ran :: "'a option list \<Rightarrow> 'a set"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   569
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   570
  "list_ran xs = {e. Some e \<in> set xs }"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   571
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   572
lemma list_ranI: "\<lbrakk> i < List.length xs; xs ! i = Some b \<rbrakk> \<Longrightarrow> b \<in> list_ran xs"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   573
unfolding list_ran_def by (drule sym, simp)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   574
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   575
lemma list_ran_update_Some:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   576
  "cl \<in> list_ran (xs[i := (Some b)]) \<Longrightarrow> cl \<in> list_ran xs \<or> cl = b"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   577
proof -
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   578
  assume assms: "cl \<in> list_ran (xs[i := (Some b)])"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   579
  have "set (xs[i := Some b]) \<subseteq> insert (Some b) (set xs)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   580
    by (simp only: set_update_subset_insert)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   581
  with assms have "Some cl \<in> insert (Some b) (set xs)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   582
    unfolding list_ran_def by fastsimp
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   583
  thus ?thesis
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   584
    unfolding list_ran_def by auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   585
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   586
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   587
lemma list_ran_update_None:
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   588
  "cl \<in> list_ran (xs[i := None]) \<Longrightarrow> cl \<in> list_ran xs"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   589
proof -
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   590
  assume assms: "cl \<in> list_ran (xs[i := None])"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   591
  have "set (xs[i := None]) \<subseteq> insert None (set xs)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   592
    by (simp only: set_update_subset_insert)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   593
  with assms show ?thesis
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   594
    unfolding list_ran_def by auto
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   595
qed
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   596
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   597
definition correctList :: "Clause list \<Rightarrow> Clause option list \<Rightarrow> bool"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   598
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   599
  "correctList rootcls xs =
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   600
  (\<forall>cl \<in> list_ran xs. correctClause rootcls cl \<and> sorted cl \<and> distinct cl)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   601
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   602
subsection {* Checker functions *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   603
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   604
fun lres_thm :: "Clause option list \<Rightarrow> (Lit * ClauseId) \<Rightarrow> Clause \<Rightarrow> Clause Heap" 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   605
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   606
  "lres_thm xs (l, j) cli = (if (j < List.length xs) then (case (xs ! j) of
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   607
  None \<Rightarrow> raise (''MiniSatChecked.res_thm: No resolvant clause in thms array for Conflict step.'')
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   608
  | Some clj \<Rightarrow> res_thm' l cli clj
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   609
 ) else raise ''Error'')"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   610
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   611
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   612
fun ldoProofStep :: " ProofStep \<Rightarrow> (Clause option list  * Clause list) \<Rightarrow> (Clause option list * Clause list) Heap"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   613
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   614
  "ldoProofStep (Conflict saveTo (i, rs)) (xs, rcl) =
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   615
     (case (xs ! i) of
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   616
       None \<Rightarrow> raise (''MiniSatChecked.doProofStep: No starting clause in thms array for Conflict step.'')
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   617
     | Some cli \<Rightarrow> (do
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   618
                      result \<leftarrow> foldM (lres_thm xs) rs cli ;
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   619
                      return ((xs[saveTo:=Some result]), rcl)
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   620
                    done))"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   621
| "ldoProofStep (Delete cid) (xs, rcl) = return (xs[cid:=None], rcl)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   622
| "ldoProofStep (Root cid clause) (xs, rcl) = return (xs[cid:=Some (sort clause)], (remdups(sort clause)) # rcl)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   623
| "ldoProofStep (Xstep cid1 cid2) (xs, rcl) = raise ''MiniSatChecked.doProofStep: Xstep constructor found.''"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   624
| "ldoProofStep (ProofDone b) (xs, rcl) = raise ''MiniSatChecked.doProofStep: ProofDone constructor found.''"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   625
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   626
definition lchecker :: "nat \<Rightarrow> ProofStep list \<Rightarrow> nat \<Rightarrow> Clause list Heap"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   627
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   628
  "lchecker n p i =
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   629
  (do 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   630
     rcs \<leftarrow> foldM (ldoProofStep) p ([], []);
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   631
     (if (fst rcs ! i) = Some [] then return (snd rcs) 
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   632
                else raise(''No empty clause''))
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   633
   done)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   634
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   635
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   636
section {* Functional version with RedBlackTrees *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   637
36147
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 36098
diff changeset
   638
fun tres_thm :: "(ClauseId, Clause) RBT_Impl.rbt \<Rightarrow> Lit \<times> ClauseId \<Rightarrow> Clause \<Rightarrow> Clause Heap"
36098
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   639
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   640
  "tres_thm t (l, j) cli =
36147
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 36098
diff changeset
   641
  (case (RBT_Impl.lookup t j) of 
36098
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   642
     None \<Rightarrow> raise (''MiniSatChecked.res_thm: No resolvant clause in thms array for Conflict step.'')
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   643
   | Some clj \<Rightarrow> res_thm' l cli clj)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   644
36147
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 36098
diff changeset
   645
fun tdoProofStep :: " ProofStep \<Rightarrow> ((ClauseId, Clause) RBT_Impl.rbt * Clause list) \<Rightarrow> ((ClauseId, Clause) RBT_Impl.rbt * Clause list) Heap"
36098
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   646
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   647
  "tdoProofStep (Conflict saveTo (i, rs)) (t, rcl) =
36147
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 36098
diff changeset
   648
     (case (RBT_Impl.lookup t i) of
36098
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   649
       None \<Rightarrow> raise (''MiniSatChecked.doProofStep: No starting clause in thms array for Conflict step.'')
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   650
     | Some cli \<Rightarrow> (do
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   651
                      result \<leftarrow> foldM (tres_thm t) rs cli;
36147
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 36098
diff changeset
   652
                      return ((RBT_Impl.insert saveTo result t), rcl)
36098
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   653
                    done))"
36147
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 36098
diff changeset
   654
| "tdoProofStep (Delete cid) (t, rcl) = return ((RBT_Impl.delete cid t), rcl)"
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 36098
diff changeset
   655
| "tdoProofStep (Root cid clause) (t, rcl) = return (RBT_Impl.insert cid (sort clause) t, (remdups(sort clause)) # rcl)"
36098
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   656
| "tdoProofStep (Xstep cid1 cid2) (t, rcl) = raise ''MiniSatChecked.doProofStep: Xstep constructor found.''"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   657
| "tdoProofStep (ProofDone b) (t, rcl) = raise ''MiniSatChecked.doProofStep: ProofDone constructor found.''"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   658
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   659
definition tchecker :: "nat \<Rightarrow> ProofStep list \<Rightarrow> nat \<Rightarrow> Clause list Heap"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   660
where
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   661
  "tchecker n p i =
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   662
  (do 
36147
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 36098
diff changeset
   663
     rcs \<leftarrow> foldM (tdoProofStep) p (RBT_Impl.Empty, []);
b43b22f63665 theory RBT with abstract type of red-black trees backed by implementation RBT_Impl
haftmann
parents: 36098
diff changeset
   664
     (if (RBT_Impl.lookup (fst rcs) i) = Some [] then return (snd rcs) 
36098
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   665
                else raise(''No empty clause''))
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   666
   done)"
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   667
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   668
section {* Code generation setup *}
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   669
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   670
code_type ProofStep
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   671
  (SML "MinisatProofStep.ProofStep")
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   672
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   673
code_const ProofDone  and  Root              and  Conflict              and  Delete  and  Xstep
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   674
     (SML "MinisatProofStep.ProofDone" and "MinisatProofStep.Root ((_),/ (_))" and "MinisatProofStep.Conflict ((_),/ (_))" and "MinisatProofStep.Delete" and "MinisatProofStep.Xstep ((_),/ (_))")
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   675
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   676
export_code checker in SML module_name SAT file -
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   677
export_code tchecker in SML module_name SAT file -
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   678
export_code lchecker in SML module_name SAT file -
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   679
53992c639da5 added imperative SAT checker; improved headers of example files; adopted IsaMakefile
bulwahn
parents:
diff changeset
   680
end