theory Eval_FO imports"HOL-Library.Infinite_Typeclass" FO begin
datatype 'a eval_res = Fin "'a table" | Infin | Wf_error
locale eval_fo = fixes wf :: "('a :: infinite, 'b) fo_fmla ==> ('b × nat ==> 'a list set) ==> 't ==> bool" and abs :: "('a fo_term) list ==> 'a table ==> 't" and rep :: "'t ==> 'a table" and res :: "'t ==> 'a eval_res" and eval_bool :: "bool ==> 't" and eval_eq :: "'a fo_term ==> 'a fo_term ==> 't" and eval_neg :: "nat list ==> 't ==> 't" and eval_conj :: "nat list ==> 't ==> nat list ==> 't ==> 't" and eval_ajoin :: "nat list ==> 't ==> nat list ==> 't ==> 't" and eval_disj :: "nat list ==> 't ==> nat list ==> 't ==> 't" and eval_exists :: "nat ==> nat list ==> 't ==> 't" and eval_forall :: "nat ==> nat list ==> 't ==> 't" assumes fo_rep: "wf φ I t ==> rep t = proj_sat φ I" and fo_res_fin: "wf φ I t ==> finite (rep t) ==> res t = Fin (rep t)" and fo_res_infin: "wf φ I t ==>¬finite (rep t) ==> res t = Infin" and fo_abs: "finite (I (r, length ts)) ==> wf (Pred r ts) I (abs ts (I (r, length ts)))" and fo_bool: "wf (Bool b) I (eval_bool b)" and fo_eq: "wf (Eqa trm trm') I (eval_eq trm trm')" and fo_neg: "wf φ I t ==> wf (Neg φ) I (eval_neg (fv_fo_fmla_list φ) t)" and fo_conj: "wf φ I tφ ==> wf ψ I tψ ==> (case ψ of Neg ψ' ==> False | _ ==> True) ==> wf (Conj φ ψ) I (eval_conj (fv_fo_fmla_list φ) tφ (fv_fo_fmla_list ψ) tψ)" and fo_ajoin: "wf φ I tφ ==> wf ψ' I tψ' ==> wf (Conj φ (Neg ψ')) I (eval_ajoin (fv_fo_fmla_list φ) tφ (fv_fo_fmla_list ψ') tψ')" and fo_disj: "wf φ I tφ ==> wf ψ I tψ ==> wf (Disj φ ψ) I (eval_disj (fv_fo_fmla_list φ) tφ (fv_fo_fmla_list ψ) tψ)" and fo_exists: "wf φ I t ==> wf (Exists i φ) I (eval_exists i (fv_fo_fmla_list φ) t)" and fo_forall: "wf φ I t ==> wf (Forall i φ) I (eval_forall i (fv_fo_fmla_list φ) t)" begin
fun eval_fmla :: "('a, 'b) fo_fmla ==> ('a table, 'b) fo_intp ==> 't"where "eval_fmla (Pred r ts) I = abs ts (I (r, length ts))"
| "eval_fmla (Bool b) I = eval_bool b"
| "eval_fmla (Eqa t t') I = eval_eq t t'"
| "eval_fmla (Neg φ) I = eval_neg (fv_fo_fmla_list φ) (eval_fmla φ I)"
| "eval_fmla (Conj φ ψ) I = (let nsφ = fv_fo_fmla_list φ; nsψ = fv_fo_fmla_list ψ; Xφ = eval_fmla φ I in case ψ of Neg ψ' ==> let Xψ' = eval_fmla ψ' I in eval_ajoin nsφ Xφ (fv_fo_fmla_list ψ') Xψ' | _ ==> eval_conj nsφ Xφ nsψ (eval_fmla ψ I))"
| "eval_fmla (Disj φ ψ) I = eval_disj (fv_fo_fmla_list φ) (eval_fmla φ I) (fv_fo_fmla_list ψ) (eval_fmla ψ I)"
| "eval_fmla (Exists i φ) I = eval_exists i (fv_fo_fmla_list φ) (eval_fmla φ I)"
| "eval_fmla (Forall i φ) I = eval_forall i (fv_fo_fmla_list φ) (eval_fmla φ I)"
lemma eval_fmla_correct: fixes φ :: "('a :: infinite, 'b) fo_fmla" assumes"wf_fo_intp φ I" shows"wf φ I (eval_fmla φ I)" using assms proof (induction φ I rule: eval_fmla.induct) case (1 r ts I) thenshow ?case using fo_abs by auto next case (2 b I) thenshow ?case using fo_bool by auto next case (3 t t' I) thenshow ?case using fo_eq by auto next case (4 φ I) thenshow ?case using fo_neg by auto next case (5 φ ψ I) have fins: "wf_fo_intp φ I""wf_fo_intp ψ I" using5(10) by auto have evalφ: "wf φ I (eval_fmla φ I)" using5(1)[OF _ _ fins(1)] by auto show ?case proof (cases "∃ψ'. ψ = Neg ψ'") case True thenobtain ψ' where ψ_def: "ψ = Neg ψ'" by auto have fin: "wf_fo_intp ψ' I" using fins(2) by (auto simp: ψ_def) have evalψ': "wf ψ' I (eval_fmla ψ' I)" using5(5)[OF _ _ _ ψ_def fin] by auto show ?thesis unfolding ψ_def using fo_ajoin[OF evalφ evalψ'] by auto next case False thenhave evalψ: "wf ψ I (eval_fmla ψ I)" using5 fins(2) by (cases ψ) auto have eval: "eval_fmla (Conj φ ψ) I = eval_conj (fv_fo_fmla_list φ) (eval_fmla φ I) (fv_fo_fmla_list ψ) (eval_fmla ψ I)" using False by (auto simp: Let_def split: fo_fmla.splits) show"wf (Conj φ ψ) I (eval_fmla (Conj φ ψ) I)" using fo_conj[OF evalφ evalψ, folded eval] False by (auto split: fo_fmla.splits) qed next case (6 φ ψ I) thenshow ?case using fo_disj by auto next case (7 i φ I) thenshow ?case using fo_exists by auto next case (8 i φ I) thenshow ?case using fo_forall by auto qed
definition eval :: "('a, 'b) fo_fmla ==> ('a table, 'b) fo_intp ==> 'a eval_res"where "eval φ I = (if wf_fo_intp φ I then res (eval_fmla φ I) else Wf_error)"
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.