작동하는 것
트리에서 수정 점 정의 내부의 목록에 수정 점 정의를 중첩하면 결과의 유형이 잘됩니다. 이것은 귀납적 유형으로 재귀를 중첩했을 때, 즉 재귀가와 같은 생성자를 통과 할 때의 일반적인 원리 list
입니다.
Fixpoint size (t : LTree) : nat :=
let size_l := (fix size_l (l : list LTree) : nat :=
match l with
| nil => 0
| h::r => size h + size_l r
end) in
match t with Node l =>
1 + size_l l
end.
또는 이것을 더 간결하게 작성하려는 경우 :
Fixpoint size (t : LTree) : nat :=
match t with Node l =>
1 + (fix size_l (l : list LTree) : nat :=
match l with
| nil => 0
| h::r => size h + size_l r
end) l
end.
(처음부터 누가 들었는지 전혀 모른다. 이것은 확실히 독립적으로 여러 번 발견되었다.)
일반 재귀 술어
보다 일반적으로 "적절한"유도 원리를 LTree
수동으로 정의 할 수 있습니다. LTree_rect
유도 원리 생성기는 유도 유형의 중첩되지 않은 엄격하게 긍정적 인 발생 만 이해하기 때문에 자동으로 생성 된 유도 원리 는 목록의 가설을 생략합니다.
LTree_rect =
fun (P : LTree -> Type) (f : forall l : list LTree, P (Node l)) (l : LTree) =>
match l as l0 return (P l0) with
| Node x => f x
end
: forall P : LTree -> Type,
(forall l : list LTree, P (Node l)) -> forall l : LTree, P l
목록에 유도 가설을 추가합시다. 재귀 호출에서이를 수행하기 위해 목록 유도 원리를 호출하고 목록 내부의 작은 나무에 트리 유도 원리를 전달합니다.
Fixpoint LTree_rect_nest (P : LTree -> Type) (Q : list LTree -> Type)
(f : forall l, Q l -> P (Node l))
(g : Q nil) (h : forall t l, P t -> Q l -> Q (cons t l))
(t : LTree) :=
match t as t0 return (P t0) with
| Node l => f l (list_rect Q g (fun u r => h u r (LTree_rect_nest P Q f g h u)) l)
end.
왜
이유에 대한 답은 재귀 함수를 받아들이는 정확한 규칙에 있습니다. 이러한 규칙은 복잡한 경우 (예 : 데이터 유형에 중첩 된 재귀가있는 경우)와 건전성 사이의 미묘한 균형이 있기 때문에 미묘합니다. COQ 참조 설명서를 소개합니다 언어 대부분 공식적으로 정확한 정의와 함께,하지만 (COQ의 증거 언어 유도 구조물의 미적분학) 당신이 연구 논문으로 이동해야합니다 유도 및 coinduction에 대한 정확한 규칙을 원하는 경우, 이 주제에 대해 Eduardo Giménez의 [1].
Coq 매뉴얼부터 Fix
규칙 표기법 으로 의 수정 점 정의를 갖습니다.F 나 X F나는{ f1: A1: = t1;에프2: A2: = t2}
Γ1Γ2= ( X : L T R의 전자 E )= ( l : l i s tL T r e e )에이1에이2= n a t= n a t티1티2= C 들 E ( X , L T의 R의 전자 즉 , λ Y. 지1( f2와이) )= c a s e ( l , l i s tL T r e e , λ Hr .지2(f1h ) ( f2r ) )
에프j티나는에프나는
- 나는 = 1j = 2 : 에서
l
보다 구조적으로 작아야합니다 .t
size
- 나는 = 2j = 1
h
l
size_l
- 나는 = 2j = 2
r
l
size_l
왜 Coq 해석기 h
보다 구조적으로 작지 않은 이유 는 l
분명하지 않습니다. Coq-club 목록 [1] [2]에 대한 논의에서 이해하는 한, 이것은 통역사의 제한 사항이며 원칙적으로 해제 될 수 있지만 불일치가 발생하지 않도록 매우 신중합니다.
참고 문헌
코카 리코, 종료되지 않는 Coq 위키 : 상호 유도
Coq-Club 메일 링리스트 :
Coq 개발팀. Coq Proof Assistant : 참조 매뉴얼 . 버전 8.3 (2010). [ 웹 ] ch. 4 .
에두아르도 기 메네즈 재귀 체계로 보호 된 정의를 체계화 . 에서 Types'94 : 증거들 및 프로그램에 대한 유형 , LNCS 996 출판사 (Springer-Verlag), 1994 년 도이 : 10.1007 / 3-540-60579-7_3 [ 스프링 ]
에두아르도 기 메네즈 유형 이론의 구조 재귀 정의 . 에서 ICALP'98 : 절차 25 오토마타, 언어 및 프로그래밍에 관한 국제 콜로키움의. Springer-Verlag, 1998. [ PDF ]