Theory PhiTest_Arithmetic
theory PhiTest_Arithmetic
imports
Phi_Semantics.PhiSem_CF_Routine
Phi_Semantics.PhiSem_CF_Breakable
Phi_Semantics.PhiSem_Variable
Phi_Semantics.PhiSem_Int_ArbiPrec
"HOL-Computational_Algebra.Primes"
begin
proc test_prime:
input βΉππΊπ
x β¦ ββΊ
output βΉππΊπ
prime x β¦ πΉβΊ
is [routine]
β΄
if βΉ$x β€ 1βΊ β΄
return (False)
β΅
β΄
βΉ2 β¦ ββΊ β var v ;;
while βΉi β¦ ππΊπ[v] β πππ»π i.
Inv: (1 < i β§ i β€ x β§ (βj. 1 < j β§ j < i βΆ Β¬ j dvd x)) β§
Guard: (i β x) β§
End: (i = x)βΊ
( βΉ$v β $xβΊ )
β΄
if βΉ$x mod $v = 0βΊ β΄
return (False)
β΅
β΄
βΉ$v + 1βΊ β $v
β΅
β΅
return (True)
β΅
β΅.
thm test_prime_def
thm test_prime_Οapp
proc test_prime':
input βΉππΊπ
x β¦ ββΊ
output βΉππΊπ
prime x β¦ πΉβΊ
is [routine]
β΄
if βΉ$x β€ 1βΊ β΄
return (False)
β΅
β΄
βΉ2 β¦ ββΊ β var v ;;
while βΉi β¦ ππΊπ[v] β πππ»π i.
Inv: (1 < i β§ i β€ x β§ (βj β {1<..<i}. Β¬ j dvd x)) β§
Guard: (i * i β€ x) β§
End: (x < i * i)βΊ
( βΉ$v * $v β€ $xβΊ )
β΄
if βΉ$x mod $v = 0βΊ β΄
return (False)
β΅
β΄
βΉ$v + 1βΊ β $v
β΅
β΅
return (True)
certified proof simp
have βΉFalseβΊ if assm: βΉΒ¬ prime xβΊ
proof -
obtain k where βΉk dvd x β§ 1 < k β§ k < xβΊ by auto_sledgehammer
then have βΉk < ib β¨ x div k < ibβΊ by auto_sledgehammer
then show False by auto_sledgehammer
qed
then show βΉprime xβΊ
by fastforce
qed
β΅
β΅ .
proc GCD:
input βΉx β¦ ππΊπ
ββ y β¦ ππΊπ
ββΊ
output βΉgcd x y β¦ ππΊπ
ββΊ
is [recursive x y]
β΄
if βΉ$x > $yβΊ β΄ GCD ($y, $x) β΅
β΄
βΉ$y mod $xβΊ β val t
if βΉ$t = 0βΊ β΄ $x β΅ β΄ GCD ($t, $x) β΅
β΅
β΅.
declare GCD_Οapp[Οsynthesis add]
proc Coprime:
input βΉx β¦ ππΊπ
ββ y β¦ ππΊπ
ββΊ
output βΉcoprime x y β¦ ππΊπ
πΉβΊ
β΄
βΉgcd $x $y = 1βΊ
β΅.
proc binary_search:
requires F: βΉβi v. ππππΌ F v β¦ i β¦ ππΊπ
[v] β€ βΌ f i β¦ ππΊπ
πΉ β¦βΊ
premises βΉmono fβΊ
input βΉlower β¦ ππΊπ
β€β upper β¦ ππΊπ
β€βΊ
premises βΉf upperβΊ and βΉlower < upperβΊ
output βΉ(LEAST i. lower β€ i β§ i β€ upper β§ f i) β¦ ππΊπ
β€βΊ
is [routine]
β΄
pure_fact βΉi β€ j βΉ f i βΉ f jβΊ for i j ;;
if ( F($lower) ) β΄ return ($lower) β΅
β΄
$lower, $upper β var $l, $u ;;
while βΉl β¦ ππΊπ[l] β€β u β¦ ππΊπ[u] β€ πππ»π l u.
Inv: (lower β€ l β§ l < u β§ u β€ upper β§ Β¬ f l β§ f u) β§
Guard: (l + 1 < u) β§
End: (l + 1 = u)βΊ
( βΉ$l + 1 < $uβΊ )
β΄
βΉ($l + $u) div 2βΊ β val m ;;
if ( F($m) ) β΄ $m β $u β΅ β΄ $m β $l β΅
β΅
return ($u)
β΅
β΅.
end