Isabelle/HOL에서 코드 생성 (ML, Python 등)을위한 삽입 정렬 알고리즘을 구현했습니다. 나는 해당 함수가 잘 작동한다고 확신하지만, 그것을 증명하고 그것을 작동 시키려면 몇 가지 정리를 만들어야한다. 내 기능은 다음과 같습니다.Isabelle을 사용한 삽입 정렬 알고리즘 증명
(* 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
, 두 번째는 두 목록이 동일한 길이를 가지고 있음을 증명하려고 : 나의 첫 번째 정리는이 있습니다.
유도 및 자동 적용시 0 정리를 얻으려는 경우 정리가 올바르며 알고리즘이 제대로 작동하지만 이후 소계를 제거하는 방법을 알지 못한다는 것을 알지 못합니다. 간단한 규칙 (lemma [simp]: ""
)을 수행하는 방법, 당신의 도움에 감사드립니다. asc xs
가 당신은 insertar x (asc xs)
정렬되어 있음을 증명해야, 정렬 가정,
1. ⋀x xs.
ordenado (asc xs) ⟹
ordenado (insertar x (asc xs))
입니다 :
@ He_slp13 : 2 가지 중요한 속성은 * sortedness * (결과 목록 정렬)이고 결과 목록은 입력의 * 순열 *입니다 (즉, 입력의 일부인 모든 요소는 동일한 숫자를 나타냅니다 출력의 시간 수). 길이를 확인하는 것만으로는 충분하지 않습니다. 기꺼이 위의 정리는 올바른 속성을 진술합니다. ('cuantos xs x'는'xs'리스트에서'x'의 발생 횟수를 나타냅니다.) – chris