src/HOL/Tools/Sledgehammer/sledgehammer_prover_atp.ML
changeset 56245 84fc7dfa3cd4
parent 55452 29ec8680e61f
child 57054 fed0329ea8e2
equal deleted inserted replaced
56244:3298b7a2795a 56245:84fc7dfa3cd4
    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