Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  Simproc_Tests.thy   Sprache: Isabelle

 

(*  Title:      HOL/ex/Simproc_Tests.thy
    Author:     Brian Huffman
*)


section ‹Testing of arithmetic simprocs›

theory Simproc_Tests
imports Main
begin

text ‹
 This theory tests the various simprocs defined in 🚫‹~~/src/HOL/Nat.thy› and
 🚫‹~~/src/HOL/Numeral_Simprocs.thy›. Many of the tests are derived from commented-out code
 originally found in 🚫‹~~/src/HOL/Tools/numeral_simprocs.ML›.
 
›

subsection ‹ML bindings›

ML ‹
 fun test ctxt procs =
 CHANGED (asm_simp_tac (put_simpset HOL_basic_ss ctxt |> fold Simplifier.add_proc procs) 1)
 
›

subsection ‹Cancellation simprocs from ‹Nat.thy››

notepad begin
  fix a b c d :: nat
  {
    assume "b = Suc c" have "a + b = Suc (c + a)"
      by (tactic ‹test context [🚫‹nateq_cancel_sums›]›) fact
  next
    assume "b < Suc c" have "a + b < Suc (c + a)"
      by (tactic ‹test context [🚫‹natless_cancel_sums›]›) fact
  next
    assume "b ≤ Suc c" have "a + b ≤ Suc (c + a)"
      by (tactic ‹test context [🚫‹natle_cancel_sums›]›) fact
  next
    assume "b - Suc c = d" have "a + b - Suc (c + a) = d"
      by (tactic ‹test context [🚫‹natdiff_cancel_sums›]›) fact
  }
end

schematic_goal "∧(y::?'b::size). size (?x::?'a::size) ≤ size y + size ?x"
  by (tactic ‹test context [🚫‹natle_cancel_sums›]›) (rule le0)
(* TODO: test more simprocs with schematic variables *)

subsection ‹Abelian group cancellation simprocs›

notepad begin
  fix a b c u :: "'a::ab_group_add"
  {
    assume "(a + 0) - (b + 0) = u" have "(a + c) - (b + c) = u"
      by (tactic ‹test context [🚫‹group_cancel_diff›]›) fact
  next
    assume "a + 0 = b + 0" have "a + c = b + c"
      by (tactic ‹test context [🚫‹group_cancel_eq›]›) fact
  }
end
(* TODO: more tests for Groups.group_cancel_{add,diff,eq,less,le} *)

subsection ‹‹int_combine_numerals››

(* FIXME: int_combine_numerals often unnecessarily regroups addition
and rewrites subtraction to negation. Ideally it should behave more
like Groups.abel_cancel_sum, preserving the shape of terms as much as
possible. *)


notepad begin
  fix a b c d oo uu i j k l u v w x y z :: "'a::comm_ring_1"
  {
    assume "a + - b = u" have "(a + c) - (b + c) = u"
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "10 + (2 * l + oo) = uu"
    have "l + 2 + 2 + 2 + (l + 2) + (oo + 2) = uu"
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "-3 + (i + (j + k)) = y"
    have "(i + j + 12 + k) - 15 = y"
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "7 + (i + (j + k)) = y"
    have "(i + j + 12 + k) - 5 = y"
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "-4 * (u * v) + (2 * x + y) = w"
    have "(2*x - (u*v) + y) - v*3*u = w"
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "2 * x * u * v + y = w"
    have "(2*x*u*v + (u*v)*4 + y) - v*u*4 = w"
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "3 * (u * v) + (2 * x * u * v + y) = w"
    have "(2*x*u*v + (u*v)*4 + y) - v*u = w"
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "-3 * (u * v) + (- (x * u * v) + - y) = w"
    have "u*v - (x*u*v + (u*v)*4 + y) = w"
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "a + - c = d"
    have "a + -(b+c) + b = d"
      apply (simp only: minus_add_distrib)
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "-2 * b + (a + - c) = d"
    have "a + -(b+c) - b = d"
      apply (simp only: minus_add_distrib)
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "-7 + (i + (j + (k + (- u + - y)))) = z"
    have "(i + j + -2 + k) - (u + 5 + y) = z"
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "-27 + (i + (j + k)) = y"
    have "(i + j + -12 + k) - 15 = y"
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "27 + (i + (j + k)) = y"
    have "(i + j + 12 + k) - -15 = y"
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  next
    assume "3 + (i + (j + k)) = y"
    have "(i + j + -12 + k) - -15 = y"
      by (tactic ‹test context [🚫‹int_combine_numerals›]›) fact
  }
end

subsection ‹‹inteq_cancel_numerals››

notepad begin
  fix i j k u vv w y z w' y' z' :: "'a::comm_ring_1"
  {
    assume "u = 0" have "2*u = u"
      by (tactic ‹test context [🚫‹inteq_cancel_numerals›]›) fact
(* conclusion matches Rings.ring_1_no_zero_divisors_class.mult_cancel_right2 *)
  next
    assume "i + (j + k) = 3 + (u + y)"
    have "(i + j + 12 + k) = u + 15 + y"
      by (tactic ‹test context [🚫‹inteq_cancel_numerals›]›) fact
  next
    assume "7 + (j + (i + k)) = y"
    have "(i + j*2 + 12 + k) = j + 5 + y"
      by (tactic ‹test context [🚫‹inteq_cancel_numerals›]›) fact
  next
    assume "u + (6*z + (4*y + 6*w)) = 6*z' + (4*y' + (6*w' + vv))"
    have "2*y + 3*z + 6*w + 2*y + 3*z + 2*u = 2*y' + 3*z' + 6*w' + 2*y' + 3*z' + u + vv"
      by (tactic ‹test context [🚫‹int_combine_numerals›, 🚫‹inteq_cancel_numerals›]›) fact
  }
end

subsection ‹‹intless_cancel_numerals››

notepad begin
  fix b c i j k u y :: "'a::linordered_idom"
  {
    assume "y < 2 * b" have "y - b < b"
      by (tactic ‹test context [🚫‹intless_cancel_numerals›]›) fact
  next
    assume "c + y < 4 * b" have "y - (3*b + c) < b - 2*c"
      by (tactic ‹test context [🚫‹intless_cancel_numerals›]›) fact
  next
    assume "i + (j + k) < 8 + (u + y)"
    have "(i + j + -3 + k) < u + 5 + y"
      by (tactic ‹test context [🚫‹intless_cancel_numerals›]›) fact
  next
    assume "9 + (i + (j + k)) < u + y"
    have "(i + j + 3 + k) < u + -6 + y"
      by (tactic ‹test context [🚫‹intless_cancel_numerals›]›) fact
  }
end

subsection ‹‹ring_eq_cancel_numeral_factor››

notepad begin
  fix x y :: "'a::{idom,ring_char_0}"
  {
    assume "3*x = 4*y" have "9*x = 12 * y"
      by (tactic ‹test context [🚫‹ring_eq_cancel_numeral_factor›]›) fact
  next
    assume "-3*x = 4*y" have "-99*x = 132 * y"
      by (tactic ‹test context [🚫‹ring_eq_cancel_numeral_factor›]›) fact
  next
    assume "111*x = -44*y" have "999*x = -396 * y"
      by (tactic ‹test context [🚫‹ring_eq_cancel_numeral_factor›]›) fact
  next
    assume "11*x = 9*y" have "-99*x = -81 * y"
      by (tactic ‹test context [🚫‹ring_eq_cancel_numeral_factor›]›) fact
  next
    assume "2*x = y" have "-2 * x = -1 * y"
      by (tactic ‹test context [🚫‹ring_eq_cancel_numeral_factor›]›) fact
  next
    assume "2*x = y" have "-2 * x = -y"
      by (tactic ‹test context [🚫‹ring_eq_cancel_numeral_factor›]›) fact
  }
end

subsection ‹‹int_div_cancel_numeral_factors››

notepad begin
  fix x y z :: "'a::{unique_euclidean_semiring,comm_ring_1,ring_char_0}"
  {
    assume "(3*x) div (4*y) = z" have "(9*x) div (12*y) = z"
      by (tactic ‹test context [🚫‹int_div_cancel_numeral_factors›]›) fact
  next
    assume "(-3*x) div (4*y) = z" have "(-99*x) div (132*y) = z"
      by (tactic ‹test context [🚫‹int_div_cancel_numeral_factors›]›) fact
  next
    assume "(111*x) div (-44*y) = z" have "(999*x) div (-396*y) = z"
      by (tactic ‹test context [🚫‹int_div_cancel_numeral_factors›]›) fact
  next
    assume "(11*x) div (9*y) = z" have "(-99*x) div (-81*y) = z"
      by (tactic ‹test context [🚫‹int_div_cancel_numeral_factors›]›) fact
  next
    assume "(2*x) div y = z"
    have "(-2 * x) div (-1 * y) = z"
      by (tactic ‹test context [🚫‹int_div_cancel_numeral_factors›]›) fact
  }
end

subsection ‹‹ring_less_cancel_numeral_factor››

notepad begin
  fix x y :: "'a::linordered_idom"
  {
    assume "3*x < 4*y" have "9*x < 12 * y"
      by (tactic ‹test context [🚫‹ring_less_cancel_numeral_factor›]›) fact
  next
    assume "-3*x < 4*y" have "-99*x < 132 * y"
      by (tactic ‹test context [🚫‹ring_less_cancel_numeral_factor›]›) fact
  next
    assume "111*x < -44*y" have "999*x < -396 * y"
      by (tactic ‹test context [🚫‹ring_less_cancel_numeral_factor›]›) fact
  next
    assume "9*y < 11*x" have "-99*x < -81 * y"
      by (tactic ‹test context [🚫‹ring_less_cancel_numeral_factor›]›) fact
  next
    assume "y < 2*x" have "-2 * x < -y"
      by (tactic ‹test context [🚫‹ring_less_cancel_numeral_factor›]›) fact
  next
    assume "23*y < x" have "-x < -23 * y"
      by (tactic ‹test context [🚫‹ring_less_cancel_numeral_factor›]›) fact
  }
end

subsection ‹‹ring_le_cancel_numeral_factor››

notepad begin
  fix x y :: "'a::linordered_idom"
  {
    assume "3*x ≤ 4*y" have "9*x ≤ 12 * y"
      by (tactic ‹test context [🚫‹ring_le_cancel_numeral_factor›]›) fact
  next
    assume "-3*x ≤ 4*y" have "-99*x ≤ 132 * y"
      by (tactic ‹test context [🚫‹ring_le_cancel_numeral_factor›]›) fact
  next
    assume "111*x ≤ -44*y" have "999*x ≤ -396 * y"
      by (tactic ‹test context [🚫‹ring_le_cancel_numeral_factor›]›) fact
  next
    assume "9*y ≤ 11*x" have "-99*x ≤ -81 * y"
      by (tactic ‹test context [🚫‹ring_le_cancel_numeral_factor›]›) fact
  next
    assume "y ≤ 2*x" have "-2 * x ≤ -1 * y"
      by (tactic ‹test context [🚫‹ring_le_cancel_numeral_factor›]›) fact
  next
    assume "23*y ≤ x" have "-x ≤ -23 * y"
      by (tactic ‹test context [🚫‹ring_le_cancel_numeral_factor›]›) fact
  next
    assume "y ≤ 0" have "0 ≤ y * -2"
      by (tactic ‹test context [🚫‹ring_le_cancel_numeral_factor›]›) fact
  next
    assume "- x ≤ y" have "- (2 * x) ≤ 2*y"
      by (tactic ‹test context [🚫‹ring_le_cancel_numeral_factor›]›) fact
  }
end

subsection ‹‹divide_cancel_numeral_factor››

notepad begin
  fix x y z :: "'a::{field,ring_char_0}"
  {
    assume "(3*x) / (4*y) = z" have "(9*x) / (12 * y) = z"
      by (tactic ‹test context [🚫‹divide_cancel_numeral_factor›]›) fact
  next
    assume "(-3*x) / (4*y) = z" have "(-99*x) / (132 * y) = z"
      by (tactic ‹test context [🚫‹divide_cancel_numeral_factor›]›) fact
  next
    assume "(111*x) / (-44*y) = z" have "(999*x) / (-396 * y) = z"
      by (tactic ‹test context [🚫‹divide_cancel_numeral_factor›]›) fact
  next
    assume "(11*x) / (9*y) = z" have "(-99*x) / (-81 * y) = z"
      by (tactic ‹test context [🚫‹divide_cancel_numeral_factor›]›) fact
  next
    assume "(2*x) / y = z" have "(-2 * x) / (-1 * y) = z"
      by (tactic ‹test context [🚫‹divide_cancel_numeral_factor›]›) fact
  }
end

subsection ‹‹ring_eq_cancel_factor››

notepad begin
  fix a b c d k x y :: "'a::idom"
  {
    assume "k = 0 ∨ x = y" have "x*k = k*y"
      by (tactic ‹test context [🚫‹ring_eq_cancel_factor›]›) fact
  next
    assume "k = 0 ∨ 1 = y" have "k = k*y"
      by (tactic ‹test context [🚫‹ring_eq_cancel_factor›]›) fact
  next
    assume "b = 0 ∨ a*c = 1" have "a*(b*c) = b"
      by (tactic ‹test context [🚫‹ring_eq_cancel_factor›]›) fact
  next
    assume "a = 0 ∨ b = 0 ∨ c = d*x" have "a*(b*c) = d*b*(x*a)"
      by (tactic ‹test context [🚫‹ring_eq_cancel_factor›]›) fact
  next
    assume "k = 0 ∨ x = y" have "x*k = k*y"
      by (tactic ‹test context [🚫‹ring_eq_cancel_factor›]›) fact
  next
    assume "k = 0 ∨ 1 = y" have "k = k*y"
      by (tactic ‹test context [🚫‹ring_eq_cancel_factor›]›) fact
  }
end

subsection ‹‹int_div_cancel_factor››

notepad begin
  fix a b c d k uu x y :: "'a::unique_euclidean_semiring"
  {
    assume "(if k = 0 then 0 else x div y) = uu"
    have "(x*k) div (k*y) = uu"
      by (tactic ‹test context [🚫‹int_div_cancel_factor›]›) fact
  next
    assume "(if k = 0 then 0 else 1 div y) = uu"
    have "(k) div (k*y) = uu"
      by (tactic ‹test context [🚫‹int_div_cancel_factor›]›) fact
  next
    assume "(if b = 0 then 0 else a * c) = uu"
    have "(a*(b*c)) div b = uu"
      by (tactic ‹test context [🚫‹int_div_cancel_factor›]›) fact
  next
    assume "(if a = 0 then 0 else if b = 0 then 0 else c div (d * x)) = uu"
    have "(a*(b*c)) div (d*b*(x*a)) = uu"
      by (tactic ‹test context [🚫‹int_div_cancel_factor›]›) fact
  }
end

lemma shows "a*(b*c)/(y*z) = d*(b::'a::linordered_field)*(x*a)/z"
oops ― ‹FIXME: need simproc to cover this case›

subsection ‹‹divide_cancel_factor››

notepad begin
  fix a b c d k uu x y :: "'a::field"
  {
    assume "(if k = 0 then 0 else x / y) = uu"
    have "(x*k) / (k*y) = uu"
      by (tactic ‹test context [🚫‹divide_cancel_factor›]›) fact
  next
    assume "(if k = 0 then 0 else 1 / y) = uu"
    have "(k) / (k*y) = uu"
      by (tactic ‹test context [🚫‹divide_cancel_factor›]›) fact
  next
    assume "(if b = 0 then 0 else a * c) = uu"
    have "(a*(b*c)) / b = uu"
      by (tactic ‹test context [🚫‹divide_cancel_factor›]›) fact
  next
    assume "(if a = 0 then 0 else if b = 0 then 0 else c / (d * x)) = uu"
    have "(a*(b*c)) / (d*b*(x*a)) = uu"
      by (tactic ‹test context [🚫‹divide_cancel_factor›]›) fact
  }
end

lemma
  fixes a b c d x y z :: "'a::linordered_field"
  shows "a*(b*c)/(y*z) = d*(b)*(x*a)/z"
oops ― ‹FIXME: need simproc to cover this case›

subsection ‹‹linordered_ring_less_cancel_factor››

notepad begin
  fix x y z :: "'a::linordered_idom"
  {
    assume "0 < z ==> x < y" have "0 < z ==> x*z < y*z"
      by (tactic ‹test context [🚫‹linordered_ring_less_cancel_factor›]›) fact
  next
    assume "0 < z ==> x < y" have "0 < z ==> x*z < z*y"
      by (tactic ‹test context [🚫‹linordered_ring_less_cancel_factor›]›) fact
  next
    assume "0 < z ==> x < y" have "0 < z ==> z*x < y*z"
      by (tactic ‹test context [🚫‹linordered_ring_less_cancel_factor›]›) fact
  next
    assume "0 < z ==> x < y" have "0 < z ==> z*x < z*y"
      by (tactic ‹test context [🚫‹linordered_ring_less_cancel_factor›]›) fact
  next
    txt "This simproc now uses the simplifier to prove that terms to
      be canceled are positive/negative."
    assume z_pos: "0 < z"
    assume "x < y" have "z*x < z*y"
      by (tactic ‹CHANGED (asm_simp_tac (put_simpset HOL_basic_ss context
 |> Simplifier.add_proc 🚫‹linordered_ring_less_cancel_factor›
 |> Simplifier.add_simp @{thm z_pos}) 1)
›) fact
  }
end

subsection ‹‹linordered_ring_le_cancel_factor››

notepad begin
  fix x y z :: "'a::linordered_idom"
  {
    assume "0 < z ==> x ≤ y" have "0 < z ==> x*z ≤ y*z"
      by (tactic ‹test context [🚫‹linordered_ring_le_cancel_factor›]›) fact
  next
    assume "0 < z ==> x ≤ y" have "0 < z ==> z*x ≤ z*y"
      by (tactic ‹test context [🚫‹linordered_ring_le_cancel_factor›]›) fact
  }
end

subsection ‹‹field_combine_numerals››

notepad begin
  fix x y z uu :: "'a::{field,ring_char_0}"
  {
    assume "5 / 6 * x = uu" have "x / 2 + x / 3 = uu"
      by (tactic ‹test context [🚫‹field_combine_numerals›]›) fact
  next
    assume "6 / 9 * x + y = uu" have "x / 3 + y + x / 3 = uu"
      by (tactic ‹test context [🚫‹field_combine_numerals›]›) fact
  next
    assume "9 / 9 * x = uu" have "2 * x / 3 + x / 3 = uu"
      by (tactic ‹test context [🚫‹field_combine_numerals›]›) fact
  next
    assume "y + z = uu"
    have "x / 2 + y - 3 * x / 6 + z = uu"
      by (tactic ‹test context [🚫‹field_combine_numerals›]›) fact
  next
    assume "1 / 15 * x + y = uu"
    have "7 * x / 5 + y - 4 * x / 3 = uu"
      by (tactic ‹test context [🚫‹field_combine_numerals›]›) fact
  }
end

lemma
  fixes x :: "'a::{linordered_field}"
  shows "2/3 * x + x / 3 = uu"
apply (tactic ‹test context [🚫‹field_combine_numerals›]›)?
oops ― ‹FIXME: test fails›

subsection ‹‹nat_combine_numerals››

notepad begin
  fix i j k m n u :: nat
  {
    assume "4*k = u" have "k + 3*k = u"
      by (tactic ‹test context [🚫‹nat_combine_numerals›]›) fact
  next
    (* FIXME "Suc (i + 3) \<equiv> i + 4" *)
    assume "4 * Suc 0 + i = u" have "Suc (i + 3) = u"
      by (tactic ‹test context [🚫‹nat_combine_numerals›]›) fact
  next
    (* FIXME "Suc (i + j + 3 + k) \<equiv> i + j + 4 + k" *)
    assume "4 * Suc 0 + (i + (j + k)) = u" have "Suc (i + j + 3 + k) = u"
      by (tactic ‹test context [🚫‹nat_combine_numerals›]›) fact
  next
    assume "2 * j + 4 * k = u" have "k + j + 3*k + j = u"
      by (tactic ‹test context [🚫‹nat_combine_numerals›]›) fact
  next
    assume "6 * Suc 0 + (5 * (i * j) + (4 * k + i)) = u"
    have "Suc (j*i + i + k + 5 + 3*k + i*j*4) = u"
      by (tactic ‹test context [🚫‹nat_combine_numerals›]›) fact
  next
    assume "5 * (m * n) = u" have "(2*n*m) + (3*(m*n)) = u"
      by (tactic ‹test context [🚫‹nat_combine_numerals›]›) fact
  }
end

subsection ‹‹nateq_cancel_numerals››

notepad begin
  fix i j k l oo u uu vv w y z w' y' z' :: "nat"
  {
    assume "Suc 0 * u = 0" have "2*u = (u::nat)"
      by (tactic ‹test context [🚫‹nateq_cancel_numerals›]›) fact
  next
    assume "Suc 0 * u = Suc 0" have "2*u = Suc (u)"
      by (tactic ‹test context [🚫‹nateq_cancel_numerals›]›) fact
  next
    assume "i + (j + k) = 3 * Suc 0 + (u + y)"
    have "(i + j + 12 + k) = u + 15 + y"
      by (tactic ‹test context [🚫‹nateq_cancel_numerals›]›) fact
  next
    assume "7 * Suc 0 + (i + (j + k)) = u + y"
    have "(i + j + 12 + k) = u + 5 + y"
      by (tactic ‹test context [🚫‹nateq_cancel_numerals›]›) fact
  next
    assume "11 * Suc 0 + (i + (j + k)) = u + y"
    have "(i + j + 12 + k) = Suc (u + y)"
      by (tactic ‹test context [🚫‹nateq_cancel_numerals›]›) fact
  next
    assume "i + (j + k) = 2 * Suc 0 + (u + y)"
    have "(i + j + 5 + k) = Suc (Suc (Suc (Suc (Suc (Suc (Suc (u + y)))))))"
      by (tactic ‹test context [🚫‹nateq_cancel_numerals›]›) fact
  next
    assume "Suc 0 * u + (2 * y + 3 * z) = Suc 0"
    have "2*y + 3*z + 2*u = Suc (u)"
      by (tactic ‹test context [🚫‹nateq_cancel_numerals›]›) fact
  next
    assume "Suc 0 * u + (2 * y + (3 * z + (6 * w + (2 * y + 3 * z)))) = Suc 0"
    have "2*y + 3*z + 6*w + 2*y + 3*z + 2*u = Suc (u)"
      by (tactic ‹test context [🚫‹nateq_cancel_numerals›]›) fact
  next
    assume "Suc 0 * u + (2 * y + (3 * z + (6 * w + (2 * y + 3 * z)))) =
      2 * y' + (3 * z' + (6 * w' + (2 * y' + (3 * z' + vv))))"
    have "2*y + 3*z + 6*w + 2*y + 3*z + 2*u =
      2*y' + 3*z' + 6*w' + 2*y' + 3*z' + u + vv"
      by (tactic ‹test context [🚫‹nateq_cancel_numerals›]›) fact
  next
    assume "2 * u + (2 * z + (5 * Suc 0 + 2 * y)) = vv"
    have "6 + 2*y + 3*z + 4*u = Suc (vv + 2*u + z)"
      by (tactic ‹test context [🚫‹nateq_cancel_numerals›]›) fact
  }
end

subsection ‹‹natless_cancel_numerals››

notepad begin
  fix length :: "'a → nat" and l1 l2 xs :: "'a" and f :: "nat → 'a"
  fix c i j k l m oo u uu vv w y z w' y' z' :: "nat"
  {
    assume "0 < j" have "(2*length xs < 2*length xs + j)"
      by (tactic ‹test context [🚫‹natless_cancel_numerals›]›) fact
  next
    assume "0 < j" have "(2*length xs < length xs * 2 + j)"
      by (tactic ‹test context [🚫‹natless_cancel_numerals›]›) fact
  next
    assume "i + (j + k) < u + y"
    have "(i + j + 5 + k) < Suc (Suc (Suc (Suc (Suc (u + y)))))"
      by (tactic ‹test context [🚫‹natless_cancel_numerals›]›) fact
  next
    assume "0 < Suc 0 * (m * n) + u" have "(2*n*m) < (3*(m*n)) + u"
      by (tactic ‹test context [🚫‹natless_cancel_numerals›]›) fact
  }
end

subsection ‹‹natle_cancel_numerals››

notepad begin
  fix length :: "'a → nat" and l2 l3 :: "'a" and f :: "nat → 'a"
  fix c e i j k l oo u uu vv w y z w' y' z' :: "nat"
  {
    assume "u + y ≤ 36 * Suc 0 + (i + (j + k))"
    have "Suc (Suc (Suc (Suc (Suc (u + y))))) ≤ ((i + j) + 41 + k)"
      by (tactic ‹test context [🚫‹natle_cancel_numerals›]›) fact
  next
    assume "5 * Suc 0 + (case length (f c) of 0 → 0 | Suc k → k) = 0"
    have "(Suc (Suc (Suc (Suc (Suc (Suc (case length (f c) of 0 => 0 | Suc k => k)))))) ≤ Suc 0)"
      by (tactic ‹test context [🚫‹natle_cancel_numerals›]›) fact
  next
    assume "6 + length l2 = 0" have "Suc (Suc (Suc (Suc (Suc (Suc (length l1 + length l2)))))) ≤ length l1"
      by (tactic ‹test context [🚫‹natle_cancel_numerals›]›) fact
  next
    assume "5 + length l3 = 0"
    have "( (Suc (Suc (Suc (Suc (Suc (length (compT P E A ST mxr e) + length l3)))))) ≤ length (compT P E A ST mxr e))"
      by (tactic ‹test context [🚫‹natle_cancel_numerals›]›) fact
  next
    assume "5 + length (compT P E (A ∪ A' e) ST mxr c) = 0"
    have "( (Suc (Suc (Suc (Suc (Suc (length (compT P E A ST mxr e) + length (compT P E (A Un A' e) ST mxr c))))))) ≤ length (compT P E A ST mxr e))"
      by (tactic ‹test context [🚫‹natle_cancel_numerals›]›) fact
  }
end

subsection ‹‹natdiff_cancel_numerals››

notepad begin
  fix length :: "'a → nat" and l2 l3 :: "'a" and f :: "nat → 'a"
  fix c e i j k l oo u uu vv v w x y z zz w' y' z' :: "nat"
  {
    assume "i + (j + k) - 3 * Suc 0 = y" have "(i + j + 12 + k) - 15 = y"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "7 * Suc 0 + (i + (j + k)) - 0 = y" have "(i + j + 12 + k) - 5 = y"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "u - Suc 0 * Suc 0 = y" have "Suc u - 2 = y"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "Suc 0 * Suc 0 + u - 0 = y" have "Suc (Suc (Suc u)) - 2 = y"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "Suc 0 * Suc 0 + (i + (j + k)) - 0 = y"
    have "(i + j + 2 + k) - 1 = y"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "i + (j + k) - Suc 0 * Suc 0 = y"
    have "(i + j + 1 + k) - 2 = y"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "2 * x + y - 2 * (u * v) = w"
    have "(2*x + (u*v) + y) - v*3*u = w"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "2 * x * u * v + (5 + y) - 0 = w"
    have "(2*x*u*v + 5 + (u*v)*4 + y) - v*u*4 = w"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "3 * (u * v) + (2 * x * u * v + y) - 0 = w"
    have "(2*x*u*v + (u*v)*4 + y) - v*u = w"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "3 * u + (2 + (2 * x * u * v + y)) - 0 = w"
    have "Suc (Suc (2*x*u*v + u*4 + y)) - u = w"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "Suc (Suc 0 * (u * v)) - 0 = w"
    have "Suc ((u*v)*4) - v*3*u = w"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "2 - 0 = w" have "Suc (Suc ((u*v)*3)) - v*3*u = w"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "17 * Suc 0 + (i + (j + k)) - (u + y) = zz"
    have "(i + j + 32 + k) - (u + 15 + y) = zz"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  next
    assume "u + y - 0 = v" have "Suc (Suc (Suc (Suc (Suc (u + y))))) - 5 = v"
      by (tactic ‹test context [🚫‹natdiff_cancel_numerals›]›) fact
  }
end

subsection ‹Factor-cancellation simprocs for type typ‹nat››

text ‹‹nat_eq_cancel_factor›, ‹nat_less_cancel_factor›,
 ‹nat_le_cancel_factor›, ‹nat_divide_cancel_factor›, and
 ‹nat_dvd_cancel_factor›.
›

notepad begin
  fix a b c d k x y uu :: nat
  {
    assume "k = 0 ∨ x = y" have "x*k = k*y"
      by (tactic ‹test context [🚫‹nat_eq_cancel_factor›]›) fact
  next
    assume "k = 0 ∨ Suc 0 = y" have "k = k*y"
      by (tactic ‹test context [🚫‹nat_eq_cancel_factor›]›) fact
  next
    assume "b = 0 ∨ a * c = Suc 0" have "a*(b*c) = b"
      by (tactic ‹test context [🚫‹nat_eq_cancel_factor›]›) fact
  next
    assume "a = 0 ∨ b = 0 ∨ c = d * x" have "a*(b*c) = d*b*(x*a)"
      by (tactic ‹test context [🚫‹nat_eq_cancel_factor›]›) fact
  next
    assume "0 < k ∧ x < y" have "x*k < k*y"
      by (tactic ‹test context [🚫‹nat_less_cancel_factor›]›) fact
  next
    assume "0 < k ∧ Suc 0 < y" have "k < k*y"
      by (tactic ‹test context [🚫‹nat_less_cancel_factor›]›) fact
  next
    assume "0 < b ∧ a * c < Suc 0" have "a*(b*c) < b"
      by (tactic ‹test context [🚫‹nat_less_cancel_factor›]›) fact
  next
    assume "0 < a ∧ 0 < b ∧ c < d * x" have "a*(b*c) < d*b*(x*a)"
      by (tactic ‹test context [🚫‹nat_less_cancel_factor›]›) fact
  next
    assume "0 < k ⟶ x ≤ y" have "x*k ≤ k*y"
      by (tactic ‹test context [🚫‹nat_le_cancel_factor›]›) fact
  next
    assume "0 < k ⟶ Suc 0 ≤ y" have "k ≤ k*y"
      by (tactic ‹test context [🚫‹nat_le_cancel_factor›]›) fact
  next
    assume "0 < b ⟶ a * c ≤ Suc 0" have "a*(b*c) ≤ b"
      by (tactic ‹test context [🚫‹nat_le_cancel_factor›]›) fact
  next
    assume "0 < a ⟶ 0 < b ⟶ c ≤ d * x" have "a*(b*c) ≤ d*b*(x*a)"
      by (tactic ‹test context [🚫‹nat_le_cancel_factor›]›) fact
  next
    assume "(if k = 0 then 0 else x div y) = uu" have "(x*k) div (k*y) = uu"
      by (tactic ‹test context [🚫‹nat_div_cancel_factor›]›) fact
  next
    assume "(if k = 0 then 0 else Suc 0 div y) = uu" have "k div (k*y) = uu"
      by (tactic ‹test context [🚫‹nat_div_cancel_factor›]›) fact
  next
    assume "(if b = 0 then 0 else a * c) = uu" have "(a*(b*c)) div (b) = uu"
      by (tactic ‹test context [🚫‹nat_div_cancel_factor›]›) fact
  next
    assume "(if a = 0 then 0 else if b = 0 then 0 else c div (d * x)) = uu"
    have "(a*(b*c)) div (d*b*(x*a)) = uu"
      by (tactic ‹test context [🚫‹nat_div_cancel_factor›]›) fact
  next
    assume "k = 0 ∨ x dvd y" have "(x*k) dvd (k*y)"
      by (tactic ‹test context [🚫‹nat_dvd_cancel_factor›]›) fact
  next
    assume "k = 0 ∨ Suc 0 dvd y" have "k dvd (k*y)"
      by (tactic ‹test context [🚫‹nat_dvd_cancel_factor›]›) fact
  next
    assume "b = 0 ∨ a * c dvd Suc 0" have "(a*(b*c)) dvd (b)"
      by (tactic ‹test context [🚫‹nat_dvd_cancel_factor›]›) fact
  next
    assume "b = 0 ∨ Suc 0 dvd a * c" have "b dvd (a*(b*c))"
      by (tactic ‹test context [🚫‹nat_dvd_cancel_factor›]›) fact
  next
    assume "a = 0 ∨ b = 0 ∨ c dvd d * x" have "(a*(b*c)) dvd (d*b*(x*a))"
      by (tactic ‹test context [🚫‹nat_dvd_cancel_factor›]›) fact
  }
end

subsection ‹Numeral-cancellation simprocs for type typ‹nat››

notepad begin
  fix x y z :: nat
  {
    assume "3 * x = 4 * y" have "9*x = 12 * y"
      by (tactic ‹test context [🚫‹nat_eq_cancel_numeral_factor›]›) fact
  next
    assume "3 * x < 4 * y" have "9*x < 12 * y"
      by (tactic ‹test context [🚫‹nat_less_cancel_numeral_factor›]›) fact
  next
    assume "3 * x ≤ 4 * y" have "9*x ≤ 12 * y"
      by (tactic ‹test context [🚫‹nat_le_cancel_numeral_factor›]›) fact
  next
    assume "(3 * x) div (4 * y) = z" have "(9*x) div (12 * y) = z"
      by (tactic ‹test context [🚫‹nat_div_cancel_numeral_factor›]›) fact
  next
    assume "(3 * x) dvd (4 * y)" have "(9*x) dvd (12 * y)"
      by (tactic ‹test context [🚫‹nat_dvd_cancel_numeral_factor›]›) fact
  }
end

subsection ‹Integer numeral div/mod simprocs›

notepad begin
  have "(10::int) div 3 = 3"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "(10::int) mod 3 = 1"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "(10::int) div -3 = -4"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "(10::int) mod -3 = -2"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "(-10::int) div 3 = -4"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "(-10::int) mod 3 = 2"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "(-10::int) div -3 = 3"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "(-10::int) mod -3 = -1"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "(8452::int) mod 3 = 1"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "(59485::int) div 434 = 137"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "(1000006::int) mod 10 = 6"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "10000000 div 2 = (5000000::int)"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "10000001 mod 2 = (1::int)"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "10000055 div 32 = (312501::int)"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "10000055 mod 32 = (23::int)"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "100094 div 144 = (695::int)"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
  have "100094 mod 144 = (14::int)"
    by (tactic ‹test context [🚫‹numeral_divmod›]›)
end

end

Messung V0.5 in Prozent
C=46 H=6 G=32

¤ Dauer der Verarbeitung: 0.22 Sekunden  (vorverarbeitet am  2026-09-29) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

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.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1126438
#Domains=1897691