(* Title: HOL/Nitpick_Examples/Manual_Nits.thy Author: Jasmin Blanchette, TU Muenchen Copyright 2009-2014
Examples from the Nitpick manual.
*)
section \<open>Examples from the Nitpick Manual\<close>
(* The "expect" arguments to Nitpick in this theory and the other example theories are there so that the example can also serve as a regression test
suite. *)
theory Manual_Nits imports HOL.Real "HOL-Library.Quotient_Product" begin
primrec lift where "lift (Var j) k = Var (if j < k then j else j + 1)" | "lift (Lam t) k = Lam (lift t (k + 1))" | "lift (App t u) k = App (lift t k) (lift u k)"
primrec loose where "loose (Var j) k = (j \ k)" | "loose (Lam t) k = loose t (Suc k)" | "loose (App t u) k = (loose t k \ loose u k)"
primrec subst\<^sub>1 where "subst\<^sub>1 \ (Var j) = \ j" | "subst\<^sub>1 \ (Lam t) =
Lam (subst\<^sub>1 (\<lambda>n. case n of 0 \<Rightarrow> Var 0 | Suc m \<Rightarrow> lift (\<sigma> m) 1) t)" | "subst\<^sub>1 \ (App t u) = App (subst\<^sub>1 \ t) (subst\<^sub>1 \ u)"
lemma"n \ reach \ 2 dvd n \ n \ 0" (* nitpick *) apply (induct set: reach) apply auto
nitpick [card = 1-4, bits = 1-4, expect = none] apply (thin_tac "n \ reach")
nitpick [expect = genuine] oops
lemma"n \ reach \ 2 dvd n \ n \ 4" by (induct set: reach) arith+
section \<open>3. Case Studies\<close>
nitpick_params [max_potential = 0]
subsection \<open>3.1. A Context-Free Grammar\<close>
datatype alphabet = a | b
inductive_set S\<^sub>1 and A\<^sub>1 and B\<^sub>1 where "[] \ S\<^sub>1"
| "w \ A\<^sub>1 \ b # w \ S\<^sub>1"
| "w \ B\<^sub>1 \ a # w \ S\<^sub>1"
| "w \ S\<^sub>1 \ a # w \ A\<^sub>1"
| "w \ S\<^sub>1 \ b # w \ S\<^sub>1"
| "\v \ B\<^sub>1; v \ B\<^sub>1\ \ a # v @ w \ B\<^sub>1"
theorem S\<^sub>1_sound: "w \ S\<^sub>1 \ length [x \ w. x = a] = length [x \ w. x = b]"
nitpick [expect = genuine] oops
inductive_set S\<^sub>2 and A\<^sub>2 and B\<^sub>2 where "[] \ S\<^sub>2"
| "w \ A\<^sub>2 \ b # w \ S\<^sub>2"
| "w \ B\<^sub>2 \ a # w \ S\<^sub>2"
| "w \ S\<^sub>2 \ a # w \ A\<^sub>2"
| "w \ S\<^sub>2 \ b # w \ B\<^sub>2"
| "\v \ B\<^sub>2; v \ B\<^sub>2\ \ a # v @ w \ B\<^sub>2"
theorem S\<^sub>2_sound: "w \ S\<^sub>2 \ length [x \ w. x = a] = length [x \ w. x = b]"
nitpick [expect = genuine] oops
inductive_set S\<^sub>3 and A\<^sub>3 and B\<^sub>3 where "[] \ S\<^sub>3"
| "w \ A\<^sub>3 \ b # w \ S\<^sub>3"
| "w \ B\<^sub>3 \ a # w \ S\<^sub>3"
| "w \ S\<^sub>3 \ a # w \ A\<^sub>3"
| "w \ S\<^sub>3 \ b # w \ B\<^sub>3"
| "\v \ B\<^sub>3; w \ B\<^sub>3\ \ a # v @ w \ B\<^sub>3"
theorem S\<^sub>3_sound: "w \ S\<^sub>3 \ length [x \ w. x = a] = length [x \ w. x = b]"
nitpick [card = 1-5, expect = none] sorry
theorem S\<^sub>3_complete: "length [x \ w. x = a] = length [x \ w. x = b] \ w \ S\<^sub>3"
nitpick [expect = genuine] oops
inductive_set S\<^sub>4 and A\<^sub>4 and B\<^sub>4 where "[] \ S\<^sub>4"
| "w \ A\<^sub>4 \ b # w \ S\<^sub>4"
| "w \ B\<^sub>4 \ a # w \ S\<^sub>4"
| "w \ S\<^sub>4 \ a # w \ A\<^sub>4"
| "\v \ A\<^sub>4; w \ A\<^sub>4\ \ b # v @ w \ A\<^sub>4"
| "w \ S\<^sub>4 \ b # w \ B\<^sub>4"
| "\v \ B\<^sub>4; w \ B\<^sub>4\ \ a # v @ w \ B\<^sub>4"
theorem S\<^sub>4_sound: "w \ S\<^sub>4 \ length [x \ w. x = a] = length [x \ w. x = b]"
nitpick [card = 1-5, expect = none] sorry
theorem S\<^sub>4_complete: "length [x \ w. x = a] = length [x \ w. x = b] \ w \ S\<^sub>4"
nitpick [card = 1-5, expect = none] sorry
theorem S\<^sub>4_A\<^sub>4_B\<^sub>4_sound_and_complete: "w \ S\<^sub>4 \ length [x \ w. x = a] = length [x \ w. x = b]" "w \ A\<^sub>4 \ length [x \ w. x = a] = length [x \ w. x = b] + 1" "w \ B\<^sub>4 \ length [x \ w. x = b] = length [x \ w. x = a] + 1"
nitpick [card = 1-5, expect = none] sorry
primrec data where "data \ = undefined" | "data (N x _ _ _) = x"
primrec dataset where "dataset \ = {}" | "dataset (N x _ t u) = {x} \ dataset t \ dataset u"
primrec level where "level \ = 0" | "level (N _ k _ _) = k"
primrec left where "left \ = \" | "left (N _ _ t\<^sub>1 _) = t\<^sub>1"
primrec right where "right \ = \" | "right (N _ _ _ t\<^sub>2) = t\<^sub>2"
fun wf where "wf \ = True" | "wf (N _ k t u) =
(if t = \<Lambda> then
k = 1 \<and> (u = \<Lambda> \<or> (level u = 1 \<and> left u = \<Lambda> \<and> right u = \<Lambda>))
else
wf t \<and> wf u \<and> u \<noteq> \<Lambda> \<and> level t < k \<and> level u \<le> k \<and> level (right u) < k)"
fun skew where "skew \ = \" | "skew (N x k t u) =
(if t \<noteq> \<Lambda> \<and> k = level t then
N (data t) k (left t) (N x k (right t) u)
else
N x k t u)"
fun split where "split \ = \" | "split (N x k t u) =
(if u \<noteq> \<Lambda> \<and> k = level (right u) then
N (data u) (Suc k) (N x k t (left u)) (right u)
else
N x k t u)"
theorem wf_skew_split: "wf t \ skew t = t" "wf t \ split t = t"
nitpick [card = 1-5, expect = none] sorry
primrec insort\<^sub>1 where "insort\<^sub>1 \ x = N x 1 \ \" | "insort\<^sub>1 (N y k t u) x = \<^cancel>\<open>(split \<circ> skew)\<close> (N y k (if x < y then insort\<^sub>1 t x else t)
(if x > y then insort\<^sub>1 u x else u))"
theorem wf_insort\<^sub>1: "wf t \<Longrightarrow> wf (insort\<^sub>1 t x)"
nitpick [expect = genuine] oops
theorem wf_insort\<^sub>1_nat: "wf t \<Longrightarrow> wf (insort\<^sub>1 t (x::nat))"
nitpick [eval = "insort\<^sub>1 t x", expect = genuine] oops
primrec insort\<^sub>2 where "insort\<^sub>2 \ x = N x 1 \ \" | "insort\<^sub>2 (N y k t u) x =
(split \<circ> skew) (N y k (if x < y then insort\<^sub>2 t x else t)
(if x > y then insort\<^sub>2 u x else u))"
theorem wf_insort\<^sub>2: "wf t \<Longrightarrow> wf (insort\<^sub>2 t x)"
nitpick [card = 1-5, expect = none] sorry
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 ist noch experimentell.