다형성 및 유도 데이터 유형


10

궁금해. OCaml 에서이 데이터 유형을 연구하고 있습니다 .

type 'a exptree =
  | Epsilon
  | Delta of 'a exptree * 'a exptree
  | Omicron of 'a
  | Iota of 'a exptree exptree

명시 적으로 형식화 된 재귀 함수 (최근에 추가 된 기능)를 사용하여 조작 할 수 있습니다. 예:

let rec map : 'a 'b. ('a -> 'b) -> 'a exptree -> 'b exptree =
  fun f ->
    begin function
    | Epsilon -> Epsilon
    | Delta (t1, t2) -> Delta (map f t1, map f t2)
    | Omicron t -> Omicron (f t)
    | Iota tt -> Iota (map (map f) tt)
    end

그러나 나는 그것을 Coq 에서 정의 할 수 없었습니다 .

Inductive exptree a :=
  | epsilon : exptree a
  | delta : exptree a -> exptree a -> exptree a
  | omicron : a -> exptree a
  | iota : exptree (exptree a) -> exptree a
.

코크 가 징징 대고있다. 마지막 생성자를 좋아하지 않으며 완전히 이해하거나 동의하지 않는 것을 말합니다.

Error: Non strictly positive occurrence of "exptree" in "exptree (exptree a) -> exptree a".

내가 이해할 수있는 것은 정의 내에서 부정을 사용하는 유도 유형 type 'a term = Constructor ('a term -> …)이 거부된다는 것입니다. 왜냐하면 (비 유형화) λ- 말단과 같은 잘 못된 근거 없는 짐승으로 이어지기 때문입니다. 그러나이 특정 exptree데이터 유형은 충분히 무해한 것처럼 보입니다 .OCaml 정의를 보면 인수 'a가 절대 위치에서 사용되지 않습니다.

Coq 는 여기서 너무 신중한 것 같습니다 . 그렇다면이 특정 유도 데이터 유형에 실제로 문제가 있습니까? 아니면 여기에 Coq 가 조금 더 관대 할 수 있습니까?

또한 다른 증거 조수들은 어떻습니까? 그러한 귀납적 정의 (자연스럽게)에 대처할 수 있습니까?

답변:


9

이것은 Coq 메일 링리스트에 여러 번 나타 났지만 결정적인 답변은 보지 못했습니다. Coq는 일반적인 것이 아닙니다. (Coquand, 1990) 및 (Giménez, 1998) (및 그의 박사 학위 논문)의 규칙은보다 일반적이며 엄격한 양성을 요구하지 않습니다. 그러나 당신이 밖에 나갈 때 충분한 양성으로는 충분하지 않습니다 Set. 이 예제는 몇 가지 토론 에서 나왔습니다 .

Inductive Big : Type := B : ((B -> Prop) -> Prop) -> Big.

귀사와 같은 일반 데이터 구조를 사용하면 유도 유형은 구현을 더 복잡하게 만드는 것 외에 다른 문제를 일으키지 않습니다.

다항식의 고정 점으로 정의 된 것과 같은 유형을 정의하는 일반적인 방법이 있습니다.

F=ϵ+δ(F×F)+οid+FF

대신 함수를 정의하는 시도의 , 유형의 가족 정의 입니다. 이는 자체 구성 수를 인코딩하는 유형에 정수 매개 변수를 추가 함을 의미합니다 ( , , , 등)을 설정하는 보조 분사 생성자 로 .exptree:aexptree(a)exptree,exptreeexptree,exptreeexptreeexptree,exptree0(a)=aexptree1(a)=exptree(a)a e x p t r e e 0 ( a ) = aexptree2(a)=exptree(exptree(a))aexptree0(a)=a

Inductive et : nat -> Type -> Type :=
  | alpha : forall a, a -> et 0 a                      (*injection*)
  | omicron : forall n a, et n a -> et (S n) a         (**)
  | epsilon : forall (S n) a, et (S n) a
  | delta : forall n a, et (S n) a -> et (S n) a -> et (S n) a
  | iota : forall n a, et (S (S n)) a -> et (S n) a
.

계속해서 값을 정의하고 작업 할 수 있습니다. Coq는 종종 지수를 유추 할 수 있습니다. Set Implicit Arguments이 정의를 더 예쁘게 만들 것입니다.

Definition exptree := et 1.
Definition et1 : exptree nat :=
  delta _ _ (omicron _ _ (alpha _ 42)) (epsilon _ _).
Definition et2 : exptree nat := iota _ _ (omicron _ _ et1).

즉, 그래서 당신은 1 인자를 감소하는 것을 선호 할 수 exptree있다 et 0. 이것은 많은 제거 S n어떤 증거 쉽게 만들 수있는 정의에서, 그러나 그것은 분할에게 이루어지는 모든 생성자의 재발 케이스에서 초기의 경우 필요 (대신에 단일 주입 생성자를 추가하는 인수를 ). 이 예제에서는 분할 할 단일 생성자 만 있으므로이 방법을 선택하는 것이 좋습니다.aa

Inductive et : nat -> Type -> Type :=
  | omicron_0 : forall a, a -> et 0 a
  | omicron_S : forall n a, et n a -> et (S n) a
  | epsilon : forall n a, et n a
  | delta : forall n a, et n a -> et n a -> et n a
  | iota : forall n a, et (S n) a -> et n a
.
Definition exptree := et 0.
Definition et1 : exptree nat :=
  delta _ _ (omicron_0 _ 42) (epsilon _ _).
Definition et2 : exptree nat :=
  (iota _ _ (omicron_S _ _ et1)).

나는 이것이 Ralph Mattes에 의해 보다 일반적인 형태 제안 된 것과 동일한 원칙이라고 생각합니다 .

참고 문헌

티에리 코 콴드와 크리스틴 폴린 유도 적으로 정의 된 유형 . 에서는 COLOG'88 논문집 , LNCS 417, 1990. [ 스프링 ] [ 구글 ]

에두아르도 기 메네즈 유형 이론의 구조 재귀 정의 . 에서 ICALP'98 : 절차 25 오토마타, 언어 및 프로그래밍에 관한 국제 콜로키움의. Springer-Verlag, 1998. [ PDF ]


8

Ralph Matthes는 Coq에서 "반복 전력에 대한 데이터 구조"( code , paper ) 에서 이와 같은 유형을 시뮬레이션하는 방법을 설명합니다 .


6

Coq가하는 첫 번째 작업 중 하나는 방금 정의한 유도 유형과 관련된 유도 원리를 구축하고 기본 유도 원리를 이해하는 것이 좋습니다.

예를 들어 O : nat | S : nat -> nat유도 원리를 생성합니다 P O -> (∀ n, P n -> P (S n)) -> ∀ n, P n.

에 해당하는 유도 원리는 무엇입니까 iota? 그것은 아무런 조건이없는 것 같습니다 P에 대해 이야기 할 수있을 것입니다 P t그리고 P (iota t)그것에 대해 이야기해야하기 때문에, exptree a, exptree (exptree a), exptree (exptree (exptree a))...

또한 Omicron같은 일을하지만 매번 유형이 더 작습니다. 더 작은 유형과 더 큰 유형을 모두 참조하면 문제가 발생할 수 있습니다. (그렇다고 Omicron옳은 방법이다)

그것은 왜 정의를 받아들이지 말아야하는지에 대한 정확한 기준은 아니지만 이것이 왜 나에게 잘못된 느낌인지 설명해줍니다.

exptree당신이 일반적으로없는 표현을위한 문법, 일 구축하는 것 같아 재귀. 도움이 필요하십니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.