1

你需要这个来获得我的进口:

(* tested with Isabelle2013-2  *)
theory Notepad
imports
  Main
  "~~/src/HOL/Library/Polynomial"
begin

notepad
begin

我有三个几乎相同的引理。

版本1:

 {
 fix a :: "('a:: comm_ring_1) poly"
  have "degree((monom 1 1) -CONST pCons a 0) =1" sledgehammer

版本2:

 {
 fix a :: "('a:: comm_ring_1) poly"
 def p ≡ "(monom 1 1) - CONST pCons a 0"
 from p_def have "degree p = 1"

版本 3:

{
 fix a :: "('a:: comm_ring_1) poly"
 have "p ≡ (monom 1 1) - CONST pCons a 0 ⟹ degree p = 1" 

这是运行大锤的结果,仅显示e定理证明器的结果;它显示了三个完全不同的结果:

(*
for instance, the three results of the prover e are:
"e": Try this: by (metis One_nat_def degree_1 degree_pCons_eq_if diff_0_right diff_pCons monom_0 monom_Suc one_poly_def zero_neq_one) (2.12 s).
"e": Try this: by (metis coeff_diff coeff_monom coeff_pCons_Suc degree_pCons_eq_if diff_0_right leading_coeff_0_iff pCons_cases zero_neq_one) (> 3 s). 
"e": Try this: by (metis One_nat_def degree_pCons_eq_if diff_0_right diff_pCons monom_0 monom_Suc one_poly_def zero_neq_one) (214 ms).
*)

问: 为什么会这样?大锤是不确定的吗?还是伊莎贝尔的三个版本不同,所以大锤得到三个不同的输入?

(* tested with Isabelle2013-2  *)
theory Notepad
imports
  Main
  "~~/src/HOL/Library/Polynomial"
begin

notepad
begin
Here is the full code:
 {
 fix a :: "('a:: comm_ring_1) poly"
  have "degree((monom 1 1) -CONST pCons a 0) =1"
(*
Sledgehammering... 
"spass": Try this: by (metis One_nat_def degree_pCons_eq_if diff_0_right diff_pCons monom_0 monom_Suc one_poly_def zero_neq_one) (2.13 s). 
"e": Try this: by (metis One_nat_def degree_1 degree_pCons_eq_if diff_0_right diff_pCons monom_0 monom_Suc one_poly_def zero_neq_one) (2.12 s).
To minimize: sledgehammer min (One_nat_def degree_1 degree_pCons_eq_if diff_0_right diff_pCons monom_0 monom_Suc one_poly_def zero_neq_one). 
"z3": Timed out. 
"remote_vampire": Timed out. 
"remote_e_sine": Try this: by (smt Nat.add_0_right Nat.add_diff_inverse Nat.diff_cancel One_nat_def Suc_diff_1 Suc_diff_Suc Suc_diff_diff Suc_diff_eq_diff_pred Suc_eq_plus1 Suc_eq_plus1_left Suc_inject Suc_le_mono Suc_lessD Suc_lessE Suc_lessI Suc_less_SucD Suc_less_eq Suc_mono Suc_neq_Zero Suc_pred Suc_pred' Zero_neq_Suc Zero_not_Suc add_Suc add_Suc_right add_Suc_shift add_diff_cancel_left' add_diff_cancel_right add_diff_cancel_right' add_eq_if add_eq_self_zero add_gr_0 add_is_0 add_is_1 add_left_cancel add_lessD1 add_less_cancel_left add_less_cancel_right add_less_mono add_less_mono1 add_pCons add_pos_pos add_right_cancel bool.size(1) bool.size(2) bool.size(3) bool.size(4) coeff_0 coeff_1 coeff_add coeff_diff coeff_linear_power coeff_monom coeff_pCons_0 coeff_pCons_Suc comm_monoid_add_class.add.left_neutral comm_monoid_add_class.add.right_neutral comm_monoid_diff_class.add_diff_cancel_left comm_monoid_diff_class.diff_cancel comm_semiring_1_class.normalizing_semiring_rules(32) comm_semiring_1_class.normalizing_semiring_rules(33) degree_0 degree_1 degree_linear_power degree_monom_eq degree_pCons_0 degree_pCons_eq degree_pCons_eq_if degree_synthetic_div diff_0_eq_0 diff_0_right diff_Suc_1 diff_Suc_Suc diff_Suc_eq_diff_pred diff_Suc_less diff_add_0 diff_add_inverse diff_add_inverse2 diff_add_zero diff_cancel2 diff_commute diff_diff_cancel diff_diff_left diff_eq_diff_eq diff_induct diff_is_0_eq diff_is_0_eq' diff_less diff_less_Suc diff_less_iff(1) diff_less_iff(2) diff_less_iff(3) diff_less_iff(4) diff_less_mono2 diff_monom diff_pCons diff_right_commute diff_self diff_self_eq_0 diff_zero diffs0_imp_equal double_add_less_zero_iff_single_add_less_zero double_zero double_zero_sym dvd.dual_order.refl dvd.lift_Suc_mono_less dvd.lift_Suc_mono_less_iff dvd_1_iff_1 dvd_1_left dvd_diff_nat dvd_minus_self dvd_plusE dvd_plus_eq_left dvd_plus_eq_right dvd_pos_nat dvd_reduce eq_diff_eq' eq_iff_diff_eq_0 exists_least_lemma field_power_not_zero gcd_lcm_complete_lattice_nat.bot.extremum gcd_lcm_complete_lattice_nat.bot.extremum_strict gcd_lcm_complete_lattice_nat.bot.extremum_unique gcd_lcm_complete_lattice_nat.bot.extremum_uniqueI gcd_lcm_complete_lattice_nat.bot.not_eq_extremum gcd_lcm_complete_lattice_nat.top.extremum_strict gcd_lcm_complete_lattice_nat.top.extremum_unique gcd_lcm_complete_lattice_nat.top.extremum_uniqueI gcd_lcm_complete_lattice_nat.top.not_eq_extremum gcd_lcm_complete_lattice_nat.top_greatest gr0I gr0_conv_Suc gr0_implies_Suc gr_implies_not0 ind_euclid infinite_descent infinite_descent0 is_zero_null le0 le_0_eq le_add_diff_inverse le_add_diff_inverse2 leading_coeff_0_iff leading_coeff_neq_0 lessE lessI less_Suc0 less_SucE less_SucI less_Suc_eq less_Suc_eq_0_disj less_Suc_induct less_add_Suc1 less_add_Suc2 less_add_eq_less less_antisym less_diff_conv less_dvd_minus less_iff_Suc_add less_imp_Suc_add less_imp_add_positive less_imp_diff_less less_irrefl_nat less_nat_zero_code less_not_refl less_not_refl2 less_not_refl3 less_trans_Suc less_zeroE lift_Suc_mono_less lift_Suc_mono_less_iff linorder_neqE_nat list_decode.cases minus_nat.diff_0 minus_poly.rep_eq minus_real_def monoid_add_class.add.left_neutral monoid_add_class.add.right_neutral monom.rep_eq monom_0 monom_Suc monom_eq_0 monom_eq_0_iff monom_eq_iff n_not_Suc_n nat.inject nat.size(1) nat.size(2) nat.size(3) nat.size(4) nat_add_assoc nat_add_commute nat_add_left_cancel nat_add_left_cancel_le nat_add_left_cancel_less nat_add_left_commute nat_add_right_cancel nat_diff_split nat_diff_split_asm nat_dvd_not_less nat_induct nat_less_cases nat_less_induct nat_lt_two_imp_zero_or_one nat_neq_iff nat_power_eq_Suc_0_iff nat_power_less_imp_less nat_zero_less_power_iff neq0_conv not0_implies_Suc not_add_less1 not_add_less2 not_less0 not_less_eq not_less_less_Suc_eq one_is_add one_poly_def one_reorient order_root pCons_0_0 pCons_cases pCons_eq_0_iff pCons_eq_iff pCons_induct pcompose_0 plus_nat.add_0 poly_0 poly_1 poly_add poly_all_0_iff_0 poly_diff poly_gcd_0_0 poly_gcd_monic poly_gcd_zero_iff poly_minus_degree_zero_const poly_power pow_divides_eq_int pow_divides_eq_nat pow_divides_pow_int pow_divides_pow_nat power_0 power_0_Suc power_0_left power_Suc_0 power_eq_0_iff power_inject_exp power_one power_one_right power_strict_increasing_iff real_0_less_add_iff real_add_eq_0_iff real_add_less_0_iff real_add_minus_iff real_arch_pow real_arch_pow_inv real_lbound_gt_zero realpow_pos_nth realpow_pos_nth2 realpow_pos_nth_unique semiring_numeral_div_class.diff_zero size_bool strict_inc_induct synthetic_div_0 synthetic_div_eq_0_iff synthetic_div_pCons trans_less_add1 trans_less_add2 transitive_stepwise_gt transitive_stepwise_lt_eq triangle_0 triangle_Suc zero_diff zero_induct zero_induct_lemma zero_less_Suc zero_less_diff zero_less_double_add_iff_zero_less_single_add zero_less_power_nat_eq zero_neq_one zero_poly.rep_eq zero_reorient) (> 3 s).
To minimize: sledgehammer min [remote_e_sine] (Nat.add_0_right Nat.add_diff_inverse Nat.diff_cancel One_nat_def Suc_diff_1 Suc_diff_Suc Suc_diff_diff Suc_diff_eq_diff_pred Suc_eq_plus1 Suc_eq_plus1_left Suc_inject Suc_le_mono Suc_lessD Suc_lessE Suc_lessI Suc_less_SucD Suc_less_eq Suc_mono Suc_neq_Zero Suc_pred Suc_pred' Zero_neq_Suc Zero_not_Suc add_Suc add_Suc_right add_Suc_shift add_diff_cancel_left' add_diff_cancel_right add_diff_cancel_right' add_eq_if add_eq_self_zero add_gr_0 add_is_0 add_is_1 add_left_cancel add_lessD1 add_less_cancel_left add_less_cancel_right add_less_mono add_less_mono1 add_pCons add_pos_pos add_right_cancel bool.size(1) bool.size(2) bool.size(3) bool.size(4) coeff_0 coeff_1 coeff_add coeff_diff coeff_linear_power coeff_monom coeff_pCons_0 coeff_pCons_Suc comm_monoid_add_class.add.left_neutral comm_monoid_add_class.add.right_neutral comm_monoid_diff_class.add_diff_cancel_left comm_monoid_diff_class.diff_cancel comm_semiring_1_class.normalizing_semiring_rules(32) comm_semiring_1_class.normalizing_semiring_rules(33) degree_0 degree_1 degree_linear_power degree_monom_eq degree_pCons_0 degree_pCons_eq degree_pCons_eq_if degree_synthetic_div diff_0_eq_0 diff_0_right diff_Suc_1 diff_Suc_Suc diff_Suc_eq_diff_pred diff_Suc_less diff_add_0 diff_add_inverse diff_add_inverse2 diff_add_zero diff_cancel2 diff_commute diff_diff_cancel diff_diff_left diff_eq_diff_eq diff_induct diff_is_0_eq diff_is_0_eq' diff_less diff_less_Suc diff_less_iff(1) diff_less_iff(2) diff_less_iff(3) diff_less_iff(4) diff_less_mono2 diff_monom diff_pCons diff_right_commute diff_self diff_self_eq_0 diff_zero diffs0_imp_equal double_add_less_zero_iff_single_add_less_zero double_zero double_zero_sym dvd.dual_order.refl dvd.lift_Suc_mono_less dvd.lift_Suc_mono_less_iff dvd_1_iff_1 dvd_1_left dvd_diff_nat dvd_minus_self dvd_plusE dvd_plus_eq_left dvd_plus_eq_right dvd_pos_nat dvd_reduce eq_diff_eq' eq_iff_diff_eq_0 exists_least_lemma field_power_not_zero gcd_lcm_complete_lattice_nat.bot.extremum gcd_lcm_complete_lattice_nat.bot.extremum_strict gcd_lcm_complete_lattice_nat.bot.extremum_unique gcd_lcm_complete_lattice_nat.bot.extremum_uniqueI gcd_lcm_complete_lattice_nat.bot.not_eq_extremum gcd_lcm_complete_lattice_nat.top.extremum_strict gcd_lcm_complete_lattice_nat.top.extremum_unique gcd_lcm_complete_lattice_nat.top.extremum_uniqueI gcd_lcm_complete_lattice_nat.top.not_eq_extremum gcd_lcm_complete_lattice_nat.top_greatest gr0I gr0_conv_Suc gr0_implies_Suc gr_implies_not0 ind_euclid infinite_descent infinite_descent0 is_zero_null le0 le_0_eq le_add_diff_inverse le_add_diff_inverse2 leading_coeff_0_iff leading_coeff_neq_0 lessE lessI less_Suc0 less_SucE less_SucI less_Suc_eq less_Suc_eq_0_disj less_Suc_induct less_add_Suc1 less_add_Suc2 less_add_eq_less less_antisym less_diff_conv less_dvd_minus less_iff_Suc_add less_imp_Suc_add less_imp_add_positive less_imp_diff_less less_irrefl_nat less_nat_zero_code less_not_refl less_not_refl2 less_not_refl3 less_trans_Suc less_zeroE lift_Suc_mono_less lift_Suc_mono_less_iff linorder_neqE_nat list_decode.cases minus_nat.diff_0 minus_poly.rep_eq minus_real_def monoid_add_class.add.left_neutral monoid_add_class.add.right_neutral monom.rep_eq monom_0 monom_Suc monom_eq_0 monom_eq_0_iff monom_eq_iff n_not_Suc_n nat.inject nat.size(1) nat.size(2) nat.size(3) nat.size(4) nat_add_assoc nat_add_commute nat_add_left_cancel nat_add_left_cancel_le nat_add_left_cancel_less nat_add_left_commute nat_add_right_cancel nat_diff_split nat_diff_split_asm nat_dvd_not_less nat_induct nat_less_cases nat_less_induct nat_lt_two_imp_zero_or_one nat_neq_iff nat_power_eq_Suc_0_iff nat_power_less_imp_less nat_zero_less_power_iff neq0_conv not0_implies_Suc not_add_less1 not_add_less2 not_less0 not_less_eq not_less_less_Suc_eq one_is_add one_poly_def one_reorient order_root pCons_0_0 pCons_cases pCons_eq_0_iff pCons_eq_iff pCons_induct pcompose_0 plus_nat.add_0 poly_0 poly_1 poly_add poly_all_0_iff_0 poly_diff poly_gcd_0_0 poly_gcd_monic poly_gcd_zero_iff poly_minus_degree_zero_const poly_power pow_divides_eq_int pow_divides_eq_nat pow_divides_pow_int pow_divides_pow_nat power_0 power_0_Suc power_0_left power_Suc_0 power_eq_0_iff power_inject_exp power_one power_one_right power_strict_increasing_iff real_0_less_add_iff real_add_eq_0_iff real_add_less_0_iff real_add_minus_iff real_arch_pow real_arch_pow_inv real_lbound_gt_zero realpow_pos_nth realpow_pos_nth2 realpow_pos_nth_unique semiring_numeral_div_class.diff_zero size_bool strict_inc_induct synthetic_div_0 synthetic_div_eq_0_iff synthetic_div_pCons trans_less_add1 trans_less_add2 transitive_stepwise_gt transitive_stepwise_lt_eq triangle_0 triangle_Suc zero_diff zero_induct zero_induct_lemma zero_less_Suc zero_less_diff zero_less_double_add_iff_zero_less_single_add zero_less_power_nat_eq zero_neq_one zero_poly.rep_eq zero_reorient).
*)

 {
 fix a :: "('a:: comm_ring_1) poly"
 def p ≡ "(monom 1 1) - CONST pCons a 0"
 from p_def have "degree p = 1"
 (*
Sledgehammering... 
"spass": Try this: by (metis One_nat_def degree_pCons_eq_if diff_0_right diff_pCons monom_0 monom_Suc one_poly_def zero_neq_one) (227 ms). 
"remote_e_sine": Timed out. 
"z3": Timed out. 
"remote_vampire": Timed out. 
"e": Try this: by (metis coeff_diff coeff_monom coeff_pCons_Suc degree_pCons_eq_if diff_0_right leading_coeff_0_iff pCons_cases zero_neq_one) (> 3 s). 
Structured proof (> 9.08 s):
proof -
  have f1: "⋀x⇩1 x⇩2. coeff 0 x⇩1 = (x⇩2∷'a poly) ∨ x⇩2 ≠ 0"
    using coeff_monom by simp
  have f2: "⋀x⇩1 x⇩2. (coeff (esk6⇩1 x⇩1) x⇩2∷'a poly) = coeff x⇩1 (Suc x⇩2)"
    by (metis coeff_pCons_Suc pCons_cases)
  have f3: "⋀x⇩1. coeff (monom 1 1) (Suc x⇩1) = coeff p (Suc x⇩1)"
    using p_def by fastforce
  have f4: "⋀x⇩1. Suc (degree (esk6⇩1 x⇩1)) = degree x⇩1 ∨ esk6⇩1 x⇩1 = 0"
    by (metis degree_pCons_eq_if pCons_cases)
  have "⋀x⇩1. degree x⇩1 = 0 ∨ esk6⇩1 x⇩1 ≠ 0"
    by (metis degree_pCons_eq_if pCons_cases)
  hence "esk6⇩1 p ≠ 0"
    using f1 f2 f3 by (metis coeff_monom leading_coeff_0_iff zero_neq_one)
  thus "degree p = 1"
    using f2 f3 f4 by (metis coeff_monom leading_coeff_0_iff)
qed
*) 

{
 fix a :: "('a:: comm_ring_1) poly"
 have "p ≡ (monom 1 1) - CONST pCons a 0 ⟹ degree p = 1" 
(*
Sledgehammering... 
"spass": Try this: by (metis One_nat_def degree_pCons_eq_if diff_0_right diff_pCons monom_0 monom_Suc one_poly_def zero_neq_one) (210 ms). 
"e": Try this: by (metis One_nat_def degree_pCons_eq_if diff_0_right diff_pCons monom_0 monom_Suc one_poly_def zero_neq_one) (214 ms). 
"z3": Timed out. 
"remote_e_sine": Try this: by (smt Nat.add_0_right Nat.add_diff_inverse Nat.diff_cancel One_nat_def Suc_diff_1 Suc_diff_Suc Suc_diff_diff Suc_diff_eq_diff_pred Suc_eq_plus1 Suc_eq_plus1_left Suc_inject Suc_le_mono Suc_lessD Suc_lessE Suc_lessI Suc_less_SucD Suc_less_eq Suc_mono Suc_neq_Zero Suc_pred Suc_pred' Zero_neq_Suc Zero_not_Suc add_Suc add_Suc_right add_Suc_shift add_diff_cancel_left' add_diff_cancel_right add_diff_cancel_right' add_eq_if add_eq_self_zero add_gr_0 add_is_0 add_is_1 add_left_cancel add_lessD1 add_less_cancel_left add_less_cancel_right add_less_mono add_less_mono1 add_pCons add_pos_pos add_right_cancel bool.size(1) bool.size(2) bool.size(3) bool.size(4) coeff_0 coeff_1 coeff_add coeff_diff coeff_linear_power coeff_monom coeff_pCons_0 coeff_pCons_Suc comm_monoid_add_class.add.left_neutral comm_monoid_add_class.add.right_neutral comm_monoid_diff_class.add_diff_cancel_left comm_monoid_diff_class.diff_cancel comm_semiring_1_class.normalizing_semiring_rules(32) comm_semiring_1_class.normalizing_semiring_rules(33) degree_0 degree_1 degree_linear_power degree_monom_eq degree_pCons_0 degree_pCons_eq degree_pCons_eq_if degree_synthetic_div diff_0_eq_0 diff_0_right diff_Suc_1 diff_Suc_Suc diff_Suc_eq_diff_pred diff_Suc_less diff_add_0 diff_add_inverse diff_add_inverse2 diff_add_zero diff_cancel2 diff_commute diff_diff_cancel diff_diff_left diff_eq_diff_eq diff_induct diff_is_0_eq diff_is_0_eq' diff_less diff_less_Suc diff_less_iff(1) diff_less_iff(2) diff_less_iff(3) diff_less_iff(4) diff_less_mono2 diff_monom diff_pCons diff_right_commute diff_self diff_self_eq_0 diff_zero diffs0_imp_equal double_add_less_zero_iff_single_add_less_zero double_zero double_zero_sym dvd.dual_order.refl dvd.lift_Suc_mono_less dvd.lift_Suc_mono_less_iff dvd_1_iff_1 dvd_1_left dvd_diff_nat dvd_minus_self dvd_plusE dvd_plus_eq_left dvd_plus_eq_right dvd_pos_nat dvd_reduce eq_diff_eq' eq_iff_diff_eq_0 exists_least_lemma field_power_not_zero gcd_lcm_complete_lattice_nat.bot.extremum gcd_lcm_complete_lattice_nat.bot.extremum_strict gcd_lcm_complete_lattice_nat.bot.extremum_unique gcd_lcm_complete_lattice_nat.bot.extremum_uniqueI gcd_lcm_complete_lattice_nat.bot.not_eq_extremum gcd_lcm_complete_lattice_nat.top.extremum_strict gcd_lcm_complete_lattice_nat.top.extremum_unique gcd_lcm_complete_lattice_nat.top.extremum_uniqueI gcd_lcm_complete_lattice_nat.top.not_eq_extremum gcd_lcm_complete_lattice_nat.top_greatest gr0I gr0_conv_Suc gr0_implies_Suc gr_implies_not0 ind_euclid infinite_descent infinite_descent0 is_zero_null le0 le_0_eq le_add_diff_inverse le_add_diff_inverse2 leading_coeff_0_iff leading_coeff_neq_0 lessE lessI less_Suc0 less_SucE less_SucI less_Suc_eq less_Suc_eq_0_disj less_Suc_induct less_add_Suc1 less_add_Suc2 less_add_eq_less less_antisym less_diff_conv less_dvd_minus less_iff_Suc_add less_imp_Suc_add less_imp_add_positive less_imp_diff_less less_irrefl_nat less_nat_zero_code less_not_refl less_not_refl2 less_not_refl3 less_trans_Suc less_zeroE lift_Suc_mono_less lift_Suc_mono_less_iff linorder_neqE_nat list_decode.cases minus_nat.diff_0 minus_poly.rep_eq minus_real_def monoid_add_class.add.left_neutral monoid_add_class.add.right_neutral monom.rep_eq monom_0 monom_Suc monom_eq_0 monom_eq_0_iff monom_eq_iff n_not_Suc_n nat.inject nat.size(1) nat.size(2) nat.size(3) nat.size(4) nat_add_assoc nat_add_commute nat_add_left_cancel nat_add_left_cancel_le nat_add_left_cancel_less nat_add_left_commute nat_add_right_cancel nat_diff_split nat_diff_split_asm nat_dvd_not_less nat_induct nat_less_cases nat_less_induct nat_lt_two_imp_zero_or_one nat_neq_iff nat_power_eq_Suc_0_iff nat_power_less_imp_less nat_zero_less_power_iff neq0_conv not0_implies_Suc not_add_less1 not_add_less2 not_less0 not_less_eq not_less_less_Suc_eq one_is_add one_poly_def one_reorient order_root pCons_0_0 pCons_cases pCons_eq_0_iff pCons_eq_iff pCons_induct pcompose_0 plus_nat.add_0 poly_0 poly_1 poly_add poly_all_0_iff_0 poly_diff poly_gcd_0_0 poly_gcd_monic poly_gcd_zero_iff poly_minus_degree_zero_const poly_power pow_divides_eq_int pow_divides_eq_nat pow_divides_pow_int pow_divides_pow_nat power_0 power_0_Suc power_0_left power_Suc_0 power_eq_0_iff power_inject_exp power_one power_one_right power_strict_increasing_iff real_0_less_add_iff real_add_eq_0_iff real_add_less_0_iff real_add_minus_iff real_arch_pow real_arch_pow_inv real_lbound_gt_zero realpow_pos_nth realpow_pos_nth2 realpow_pos_nth_unique semiring_numeral_div_class.diff_zero size_bool strict_inc_induct synthetic_div_0 synthetic_div_eq_0_iff synthetic_div_pCons trans_less_add1 trans_less_add2 transitive_stepwise_gt transitive_stepwise_lt_eq triangle_0 triangle_Suc zero_diff zero_induct zero_induct_lemma zero_less_Suc zero_less_diff zero_less_double_add_iff_zero_less_single_add zero_less_power_nat_eq zero_neq_one zero_poly.rep_eq zero_reorient) (> 3 s).
To minimize: sledgehammer min [remote_e_sine] (Nat.add_0_right Nat.add_diff_inverse Nat.diff_cancel One_nat_def Suc_diff_1 Suc_diff_Suc Suc_diff_diff Suc_diff_eq_diff_pred Suc_eq_plus1 Suc_eq_plus1_left Suc_inject Suc_le_mono Suc_lessD Suc_lessE Suc_lessI Suc_less_SucD Suc_less_eq Suc_mono Suc_neq_Zero Suc_pred Suc_pred' Zero_neq_Suc Zero_not_Suc add_Suc add_Suc_right add_Suc_shift add_diff_cancel_left' add_diff_cancel_right add_diff_cancel_right' add_eq_if add_eq_self_zero add_gr_0 add_is_0 add_is_1 add_left_cancel add_lessD1 add_less_cancel_left add_less_cancel_right add_less_mono add_less_mono1 add_pCons add_pos_pos add_right_cancel bool.size(1) bool.size(2) bool.size(3) bool.size(4) coeff_0 coeff_1 coeff_add coeff_diff coeff_linear_power coeff_monom coeff_pCons_0 coeff_pCons_Suc comm_monoid_add_class.add.left_neutral comm_monoid_add_class.add.right_neutral comm_monoid_diff_class.add_diff_cancel_left comm_monoid_diff_class.diff_cancel comm_semiring_1_class.normalizing_semiring_rules(32) comm_semiring_1_class.normalizing_semiring_rules(33) degree_0 degree_1 degree_linear_power degree_monom_eq degree_pCons_0 degree_pCons_eq degree_pCons_eq_if degree_synthetic_div diff_0_eq_0 diff_0_right diff_Suc_1 diff_Suc_Suc diff_Suc_eq_diff_pred diff_Suc_less diff_add_0 diff_add_inverse diff_add_inverse2 diff_add_zero diff_cancel2 diff_commute diff_diff_cancel diff_diff_left diff_eq_diff_eq diff_induct diff_is_0_eq diff_is_0_eq' diff_less diff_less_Suc diff_less_iff(1) diff_less_iff(2) diff_less_iff(3) diff_less_iff(4) diff_less_mono2 diff_monom diff_pCons diff_right_commute diff_self diff_self_eq_0 diff_zero diffs0_imp_equal double_add_less_zero_iff_single_add_less_zero double_zero double_zero_sym dvd.dual_order.refl dvd.lift_Suc_mono_less dvd.lift_Suc_mono_less_iff dvd_1_iff_1 dvd_1_left dvd_diff_nat dvd_minus_self dvd_plusE dvd_plus_eq_left dvd_plus_eq_right dvd_pos_nat dvd_reduce eq_diff_eq' eq_iff_diff_eq_0 exists_least_lemma field_power_not_zero gcd_lcm_complete_lattice_nat.bot.extremum gcd_lcm_complete_lattice_nat.bot.extremum_strict gcd_lcm_complete_lattice_nat.bot.extremum_unique gcd_lcm_complete_lattice_nat.bot.extremum_uniqueI gcd_lcm_complete_lattice_nat.bot.not_eq_extremum gcd_lcm_complete_lattice_nat.top.extremum_strict gcd_lcm_complete_lattice_nat.top.extremum_unique gcd_lcm_complete_lattice_nat.top.extremum_uniqueI gcd_lcm_complete_lattice_nat.top.not_eq_extremum gcd_lcm_complete_lattice_nat.top_greatest gr0I gr0_conv_Suc gr0_implies_Suc gr_implies_not0 ind_euclid infinite_descent infinite_descent0 is_zero_null le0 le_0_eq le_add_diff_inverse le_add_diff_inverse2 leading_coeff_0_iff leading_coeff_neq_0 lessE lessI less_Suc0 less_SucE less_SucI less_Suc_eq less_Suc_eq_0_disj less_Suc_induct less_add_Suc1 less_add_Suc2 less_add_eq_less less_antisym less_diff_conv less_dvd_minus less_iff_Suc_add less_imp_Suc_add less_imp_add_positive less_imp_diff_less less_irrefl_nat less_nat_zero_code less_not_refl less_not_refl2 less_not_refl3 less_trans_Suc less_zeroE lift_Suc_mono_less lift_Suc_mono_less_iff linorder_neqE_nat list_decode.cases minus_nat.diff_0 minus_poly.rep_eq minus_real_def monoid_add_class.add.left_neutral monoid_add_class.add.right_neutral monom.rep_eq monom_0 monom_Suc monom_eq_0 monom_eq_0_iff monom_eq_iff n_not_Suc_n nat.inject nat.size(1) nat.size(2) nat.size(3) nat.size(4) nat_add_assoc nat_add_commute nat_add_left_cancel nat_add_left_cancel_le nat_add_left_cancel_less nat_add_left_commute nat_add_right_cancel nat_diff_split nat_diff_split_asm nat_dvd_not_less nat_induct nat_less_cases nat_less_induct nat_lt_two_imp_zero_or_one nat_neq_iff nat_power_eq_Suc_0_iff nat_power_less_imp_less nat_zero_less_power_iff neq0_conv not0_implies_Suc not_add_less1 not_add_less2 not_less0 not_less_eq not_less_less_Suc_eq one_is_add one_poly_def one_reorient order_root pCons_0_0 pCons_cases pCons_eq_0_iff pCons_eq_iff pCons_induct pcompose_0 plus_nat.add_0 poly_0 poly_1 poly_add poly_all_0_iff_0 poly_diff poly_gcd_0_0 poly_gcd_monic poly_gcd_zero_iff poly_minus_degree_zero_const poly_power pow_divides_eq_int pow_divides_eq_nat pow_divides_pow_int pow_divides_pow_nat power_0 power_0_Suc power_0_left power_Suc_0 power_eq_0_iff power_inject_exp power_one power_one_right power_strict_increasing_iff real_0_less_add_iff real_add_eq_0_iff real_add_less_0_iff real_add_minus_iff real_arch_pow real_arch_pow_inv real_lbound_gt_zero realpow_pos_nth realpow_pos_nth2 realpow_pos_nth_unique semiring_numeral_div_class.diff_zero size_bool strict_inc_induct synthetic_div_0 synthetic_div_eq_0_iff synthetic_div_pCons trans_less_add1 trans_less_add2 transitive_stepwise_gt transitive_stepwise_lt_eq triangle_0 triangle_Suc zero_diff zero_induct zero_induct_lemma zero_less_Suc zero_less_diff zero_less_double_add_iff_zero_less_single_add zero_less_power_nat_eq zero_neq_one zero_poly.rep_eq zero_reorient). 
Sledgehammer ran out of time.
*)
4

2 回答 2

4

许多陈述有多个证明。当您像在此处所做的那样转换语句时,您会影响搜索的方向,尤其是相关性过滤器。确定性从来都不是大锤的设计目标。

于 2014-01-19T14:21:37.903 回答
3

对您的问题的非专家简短回答是,您的不同版本会产生不同的问题,只需对使用该overlord选项生成的问题文件进行比较即可看出这一点,如下所述。

Jasmin Blanchette 是 Sledgehammer 的主要开发人员,但我没有在 SO 上见过他。他在 Isabelle 用户邮件列表中回复。拉里·保尔森(Larry Paulson)也与 Sledgehammer 有一些关系。

我回答这个问题是为了提供一个如何使用overlord选项的示例sledgehammerWindows 上的Vampire ATP不起作用,所以在很久以前我向 Jasmin 报告时,他告诉我如何使用overlord生成问题文件发送给他,如下所述。

我为证明者的前两个​​版本生成问题文件e

我一直在努力尝试理解 Sledgehammer,以至于我对一个简短的回答感到满意,例如,“有一种语言,eSledgehammer 将引理转换成一堆用“ee

雄心勃勃的人可以将 Sledgehammer 生成的问题文件中的内容与使用的语言进行匹配e。这可能很明显为什么一个特定的引理,以两种不同的方式表示,会导致两个不同的问题e

有一个 TUM 链接eE Theorem Prover和一个Wiki 链接

现在我给出细节。该overlord选项会在我的主文件夹中生成一个名为prob_e_1. 它会报告一个名为 的文件prob_e_1_proof,但我不关心这个。

(* Version 1 *)
notepad 
begin
  fix a :: "('a:: comm_ring_1) poly" 
  have "degree((monom 1 1) -CONST pCons a 0) =1"
sledgehammer[overlord=true, provers="e"]
oops

我用你的第二个版本再做一次,它覆盖了以前的文件:

(* Version 2 *)
notepad begin
 fix a :: "('a:: comm_ring_1) poly"
 def p ≡ "(monom 1 1) - CONST pCons a 0"
 from p_def have "degree p = 1"
sledgehammer[overlord=true, provers="e"]
oops

我重命名了第一个文件。文件大小不同。我使用 jEdit 插件JDiff轻松地做一个差异。它们从第一行开始就不同,这是e给出的命令。

为了向您展示您将看到的内容,这里是第一个版本问题的前几行:

% TIMEFORMAT='%3R'; { time (exec 2>&1; '/cygdrive/e/E_2/dev/Isabelle2013-2/contrib/e-1.8/x86-cygwin/eprover' --tstp-in --tstp-out --silent --split-clauses=4 --split-reuse-defs --simul-paramod --forward-context-sr --destructive-er-aggressive --destructive-er --presat-simplify --prefer-initial-clauses -winvfreqrank -c1 -Ginvfreqconjmax -F1 --delete-bad-limit=150000000 -WSelectMaxLComplexAvoidPosPred -H'(4*FunWeight(SimulateSOS,20,20,1.5,1.5,1,a2:0,degree_poly_a:0,minus_154650241poly_a:0,monom_poly_a:0,one_one_nat:0,one_one_poly_a:0,pCons_poly_a:0,zero_z2096148049poly_a:0,minus_1267152911poly_a:8,minus_1927295133poly_a:8,pCons_1263018438poly_a:8,minus_minus_a:9,minus_minus_poly_a:9,pCons_a:9,pCons_poly_poly_a:9,monom_1144868891atural:9,tt_poly_Code_natural:9,zero_z1864290105atural:9,zero_z2076475201atural:9,monom_poly_nat:9,tt_poly_nat:9,zero_z1059985641ly_nat:9,zero_zero_poly_nat:9,monom_67158909poly_a:9,tt_poly_poly_poly_a:9,zero_z1199790189poly_a:9,zero_z2064990175poly_a:9,monom_a:9,tt_a:9,zero_zero_a:9,zero_zero_poly_a:9,monom_poly_poly_a:10,tt_poly_poly_a:10,monom_nat:10,zero_zero_nat:10,monom_Code_natural:10,zero_z353611057atural:10,tt_poly_a:10,pCons_1690884498atural:11,tt_pol1445527701atural:11,pCons_poly_nat:11,tt_poly_poly_nat:11,tt_pol1146364953poly_a:12,pCons_nat:12,pCons_Code_natural:12,minus_1521903873atural:14,minus_minus_nat:14,one_one_poly_poly_a:15,one_one_a:16,one_on446885109atural:16,one_one_Code_natural:16,one_one_poly_nat:16,one_on392296739poly_a:16,degree_a:17,degree_Code_natural:18,degree_nat:18,degree_poly_poly_a:18,aa_poly_poly_a_bool:23,pp:23,aa_poly_a_bool:23,aa_pol1791115049l_bool:23,aa_poly_nat_bool:23,aa_pol1868968491a_bool:23,degree1502533245atural:24,degree_poly_nat:24,degree368812443poly_a:24,is_zero_poly_a:26,is_zero_a:26,is_zero_Code_natural:26,is_zero_nat:26,is_zero_poly_poly_a:26,pcompose_poly_a:27,pcompose_a:27,pcompo775675211atural:27,pcompose_nat:27,pcompose_poly_poly_a:27,power_276493840poly_a:27,power_power_poly_a:27,power_1061922746atural:28,power_power_poly_nat:28,power_1749536158poly_a:28,synthetic_div_poly_a:28,synthetic_div_a:28,synthe389744629atural:28,synthetic_div_nat:28,synthe1271504013poly_a:29,suc:29,coeff_a:30,coeff_poly_poly_a:30,coeff_nat:30,coeff_Code_natural:30,coeff_poly_a:30,coeff_2076392010atural:30,one_on1013003517atural:30,coeff_poly_nat:30,one_on1411366565ly_nat:30,coeff_36192014poly_a:30,one_on1584232881poly_a:30,poly_poly_a:31,poly_nat:31,poly_a:31,a:32,code_natural:32,fFalse:32,fTrue:32,nat:32,poly:32,tt_bool:32,undefi1030841758poly_a:32,undefi122925008atural:32,undefi1684997496ly_nat:32,undefi2131925448atural:32,undefi65090320poly_a:32,undefi880707458poly_a:32,undefined_a:32,undefined_poly_a:32,undefined_poly_nat:32,power_power_nat:36,aa_nat_bool:37,aa_nat_fun_nat_bool:37,code_natural_size:38,size_s686587580atural:38,ord_less_nat:39),3*ConjectureGeneralSymbolWeight(PreferNonGoals,200,100,200,50,50,1,100,1.5,1.5,1),1*Clauseweight(PreferProcessed,1,1,1),1*FIFOWeight(PreferProcessed))'  --term-ordering=KBO6 --cpu-limit=9 --proof-object=1 '/cygdrive/e/E_1/02-p/pi/home/.isabelle/Isabelle2013-2/prob_e_1' ) ; }
% This file was generated by Isabelle (most likely Sledgehammer)
% 2014-01-12 10:46:41.037

% Explicit typings (80)
fof(tsy_c_Groups_Ominus__class_Ominus_001t__Polynomial__Opoly_It__Polynomial__Opoly_It__Polynomial__Opoly_It__Polynomial__Opoly_Itf__a_J_J_J_J, axiom,
    ((![B_1, B_2]: tt_pol1146364953poly_a(minus_1927295133poly_a(B_1, B_2)) = minus_1927295133poly_a(B_1, B_2)))).
fof(tsy_c_Groups_Ominus__class_Ominus_001t__Polynomial__Opoly_It__Polynomial__Opoly_It__Polynomial__Opoly_Itf__a_J_J_J, axiom,
    ((![B_1, B_2]: tt_poly_poly_poly_a(minus_1267152911poly_a(B_1, B_2)) = minus_1267152911poly_a(B_1, B_2)))).
fof(tsy_c_Groups_Ominus__class_Ominus_001t__Polynomial__Opoly_It__Polynomial__Opoly_Itf__a_J_J, hypothesis,
    ((![B_1, B_2]: tt_poly_poly_a(minus_154650241poly_a(B_1, B_2)) = minus_154650241poly_a(B_1, B_2)))).

我将您的第一个版本转换为使用theorem而不是notepad,并且问题文件是相同的,除了时间戳和另外一行。

(* Version 1 as theorem *)
theorem
  fixes a :: "('a:: comm_ring_1) poly"
  shows "degree((monom 1 1) -CONST pCons a 0) =1"
(*sledgehammer[overlord=true, provers="e"]*)
by(metis 
  One_nat_def degree_pCons_eq_if diff_0_right diff_pCons monom_0 
  monom_Suc one_poly_def zero_neq_one)

关于大锤是否是确定性的

更新 140112_1651

周日晚上没有专家出现,所以我通过在下面提供一些 Sledgehammer 文档链接来充当文档管理员。

不过,首先,我对 Sledgehammer 是否可以是 OP 定义的确定性进行了 3 个简单的观察,“从某种意义上说,如果你连续运行 sledgehammer 几次(即,在完全相同的定理定义上),你会得到相同的结果”。除了他的定义,我对决定论一无所知。

为了使 Sledgehammer 具有确定性,我看到三件事必须是确定性的,我试图做到足够笼统以确保正确。

此外,PIDE 可能有很多多线程,这会极大地影响处理分配给任何事物的方式,这可能会影响特定 ATP 是否会找到特定证明。

  1. 给定定理陈述和一组固定的可用事实(先验定理),对于特定的自动定理证明器 (ATP),Sledgehammer 算法必须始终为 ATP 生成相同的问题。存在最初的问题,但 Sledgehammer 可能会为 ATP 产生一系列问题,以尝试消除不需要的事实。(这可能更复杂,一些固定的问题都会产生相同的结果。)
  2. 对于 ATP 从 Sledgehammer 收到的固定问题,ATP 证明尝试必须始终以相同的方式成功或失败。
  3. smt或方法,给定相同的metis事实,必须始终以相同的方式成功或失败。这可能很简单,但我列出了它。

从本质上讲,我上面列表中的价值在于它可能会带走 Sledgehammer 的一些奥秘。Sledgehammer 是生成问题的 Sledgehammer 算法、第 3 方 ATP 和证明方法之间的团队smt合作metis

大锤从数千个可用的定理中找到适用的定理并使用它们给 ATP 以 ATP 的语言提出问题。ATP 通过定理执行其逻辑魔法,并向 Sledgehammer 报告。Sledgehammer 从 ATP 读取返回消息,如果找到证明,它会在输出面板中建议可以使用的smt或证明。metis在此过程中,Sledgehammer 可以自行回放证明以消除不需要的事实,或者根据所选的 Sledgehammer 选项执行任何各种操作。

这是 Larry Paulson 的网页,其中包含特定于 Isabelle 和 ATP 的文档:

将 Isabelle 与自动定理证明器联系起来

顶部是指向不同出版物页面的各种链接,其中一些是下拉的。

这是 Jasmin Blanchette 的出版页面,恰好包含他所有的东西,所以我链接到他的研讨会论文部分,以及 Paulson 和 Blanchette 的一篇论文,我发现它是一个易于阅读的概述。

我们可以假设 Sledgehammer 专家可以回答我列表中的 1 和 3。他们还将熟悉 ATP 所做的大部分工作,但他们可能并不关心了解有关 ATP 的一切,除了防止诸如不一致之类的事情所必需的。

于 2014-01-12T16:51:52.233 回答