コード (ML、Python など) を生成するために、Isabelle/HOL で挿入ソート アルゴリズムを実装しました。対応する関数が正常に機能すると確信していますが、それを証明するためにいくつかの定理を作成し、それが確実に機能することを確認する必要があります。私の機能は次のとおりです。
(* The following functions are used to prove the algorithm works fine *)
fun menor_igual :: "nat ⇒ nat list ⇒ bool" where
"menor_igual n [] = True" |
"menor_igual n (x # xs) = (n ≤ x ∧ menor_igual n xs)"
fun ordenado :: "nat list ⇒ bool" where
"ordenado [] = True" |
"ordenado (x # xs) = (menor_igual x xs ∧ ordenado xs)"
fun cuantos :: "nat list ⇒ nat ⇒ nat" where
"cuantos [] num = 0" |
"cuantos (x # xs) num = (if x = num then Suc (cuantos xs num) else cuantos xs num)"
(* These functions make the algorithm itself *)
fun insertar:: "nat ⇒ nat list ⇒ nat list" where
"insertar num [] = [num]" |
"insertar num (x # xs) = (if (num ≤ x) then (num # x # xs) else x # insertar num xs)"
fun asc :: "nat list ⇒ nat list" where
"asc [] = []" |
"asc (x # xs) = insertar x (asc xs)"
問題は、定理を正しく作成する方法がわからないことです。順序付けられたリストが元のリストと同じ長さであり、両方のリストの要素の名前が同じであることを証明する必要があります。私の最初の定理は次のとおりです。
theorem "ordenado (asc xs)"
apply (induction xs rule: asc.induct)
apply auto
theorem "cuantos (asc xs) x = cuantos xs x"
apply (induction xs rule: asc.induct)
apply auto
最初の定理はリストが正しく順序付けられていることを証明しようとし、2 番目の定理は両方のリストが同じ長さであることを証明しようとします。
誘導と自動を適用すると、サブゴールが0になると予想されます。これは、定理が正しく、アルゴリズムが正常に機能することを示していますが、その後、サブゴラスを削除する方法がわかりません。簡略化規則 ( lemma [simp]: ""
) を使用してください。よろしくお願いします。