75 | is_bad_equal _ _ = false |
75 | is_bad_equal _ _ = false |
76 fun do_equals t1 t2 = is_bad_equal t1 t2 orelse is_bad_equal t2 t1 |
76 fun do_equals t1 t2 = is_bad_equal t1 t2 orelse is_bad_equal t2 t1 |
77 fun do_formula pos t = |
77 fun do_formula pos t = |
78 (case (pos, t) of |
78 (case (pos, t) of |
79 (_, @{const Trueprop} $ t1) => do_formula pos t1 |
79 (_, @{const Trueprop} $ t1) => do_formula pos t1 |
80 | (true, Const (@{const_name all}, _) $ Abs (_, _, t')) => do_formula pos t' |
80 | (true, Const (@{const_name Pure.all}, _) $ Abs (_, _, t')) => do_formula pos t' |
81 | (true, Const (@{const_name All}, _) $ Abs (_, _, t')) => do_formula pos t' |
81 | (true, Const (@{const_name All}, _) $ Abs (_, _, t')) => do_formula pos t' |
82 | (false, Const (@{const_name Ex}, _) $ Abs (_, _, t')) => do_formula pos t' |
82 | (false, Const (@{const_name Ex}, _) $ Abs (_, _, t')) => do_formula pos t' |
83 | (_, @{const "==>"} $ t1 $ t2) => |
83 | (_, @{const Pure.imp} $ t1 $ t2) => |
84 do_formula (not pos) t1 andalso (t2 = @{prop False} orelse do_formula pos t2) |
84 do_formula (not pos) t1 andalso (t2 = @{prop False} orelse do_formula pos t2) |
85 | (_, @{const HOL.implies} $ t1 $ t2) => |
85 | (_, @{const HOL.implies} $ t1 $ t2) => |
86 do_formula (not pos) t1 andalso (t2 = @{const False} orelse do_formula pos t2) |
86 do_formula (not pos) t1 andalso (t2 = @{const False} orelse do_formula pos t2) |
87 | (_, @{const Not} $ t1) => do_formula (not pos) t1 |
87 | (_, @{const Not} $ t1) => do_formula (not pos) t1 |
88 | (true, @{const HOL.disj} $ t1 $ t2) => forall (do_formula pos) [t1, t2] |
88 | (true, @{const HOL.disj} $ t1 $ t2) => forall (do_formula pos) [t1, t2] |
89 | (false, @{const HOL.conj} $ t1 $ t2) => forall (do_formula pos) [t1, t2] |
89 | (false, @{const HOL.conj} $ t1 $ t2) => forall (do_formula pos) [t1, t2] |
90 | (true, Const (@{const_name HOL.eq}, _) $ t1 $ t2) => do_equals t1 t2 |
90 | (true, Const (@{const_name HOL.eq}, _) $ t1 $ t2) => do_equals t1 t2 |
91 | (true, Const (@{const_name "=="}, _) $ t1 $ t2) => do_equals t1 t2 |
91 | (true, Const (@{const_name Pure.eq}, _) $ t1 $ t2) => do_equals t1 t2 |
92 | _ => false) |
92 | _ => false) |
93 in do_formula true end |
93 in do_formula true end |
94 |
94 |
95 (* Facts containing variables of finite types such as "unit" or "bool" or of the form |
95 (* Facts containing variables of finite types such as "unit" or "bool" or of the form |
96 "ALL x. x = A | x = B | x = C" are likely to lead to untypable proofs for unsound type |
96 "ALL x. x = A | x = B | x = C" are likely to lead to untypable proofs for unsound type |