Đa hình và kiểu dữ liệu quy nạp


10

Tôi tò mò. Tôi đã làm việc với kiểu dữ liệu này ở OCaml :

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

Có thể được thao tác bằng cách sử dụng các hàm đệ quy được gõ rõ ràng (một tính năng đã được thêm vào gần đây). Thí dụ:

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

Nhưng tôi chưa bao giờ có thể định nghĩa nó trong Coq :

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

Coq đang rên rỉ. Nó không giống như nhà xây dựng cuối cùng và nói điều gì đó tôi không hoàn toàn hiểu hoặc đồng ý với:

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

Những gì tôi có thể hiểu là các loại quy nạp sử dụng một phủ định bên trong định nghĩa của chúng giống như type 'a term = Constructor ('a term -> …)bị từ chối, bởi vì chúng sẽ dẫn đến các con thú xấu xí không có căn cứ như (thuật ngữ). Tuy nhiên exptreekiểu dữ liệu cụ thể này có vẻ vô hại đủ: nhìn vào định nghĩa OCaml của nó, đối số của nó 'akhông bao giờ được sử dụng ở các vị trí phủ định.

Có vẻ như Coq quá thận trọng ở đây. Vì vậy, có thực sự có một vấn đề với kiểu dữ liệu quy nạp đặc biệt này? Hay Coq có thể được cho phép hơn một chút ở đây?

Ngoài ra, những gì về các trợ lý chứng minh khác, họ có thể đối phó với một định nghĩa quy nạp như vậy (một cách tự nhiên)?

Câu trả lời:


9

Điều này đã được đưa ra trong danh sách gửi thư Coq nhiều lần, nhưng tôi chưa bao giờ thấy một câu trả lời kết luận. Coq không chung chung như nó có thể được; các quy tắc trong (Coquand, 1990) và (Giménez, 1998) (và luận án tiến sĩ của ông) chung chung hơn và không đòi hỏi sự tích cực nghiêm ngặt. Tích cực đủ là không đủ, tuy nhiên, khi bạn đi ra ngoài Set; ví dụ này xuất hiện trong một số cuộc thảo luận :

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

Với các cấu trúc dữ liệu đơn giản như của bạn, kiểu quy nạp sẽ không gây ra vấn đề gì ngoài việc làm cho việc triển khai trở nên phức tạp hơn.

F= =ε+δ(F×F)+phảiTôid+FF

exptree:mộtexptree(một)exptree,exptreeexptree,exptreeexptreeexptree,Giáo dụcexptree0(một)= =mộtexptree1(một)= =exptree(một)exptree2(một)= =exptree(exptree(một))mộtexptree0(một)= =một

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
.

Bạn có thể tiến hành xác định các giá trị và làm việc với chúng. Coq thường sẽ có thể suy ra số mũ. Set Implicit Argumentssẽ làm cho những định nghĩa đẹp hơn.

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

exptreeet 0S nmộtmột

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)).

Tôi nghĩ rằng đây là nguyên tắc tương tự được đề xuất trong một hình thức tổng quát hơn của Ralph Mattes .

Người giới thiệu

Thierry Coquand và Christine Paulin. Các loại xác định tự cảm . Trong Kỷ yếu của COLOG'88 , LNCS 417, 1990. [ Springer ] [ Google ]

Eduardo Giménez. Định nghĩa đệ quy cấu trúc trong lý thuyết loại . Trong ICALP'98: Kỷ yếu của Hội thảo quốc tế lần thứ 25 về Automata, Ngôn ngữ và Lập trình. Springer-Verlag, 1998. [ PDF ]


8

Ralph Matthes mô tả cách mô phỏng các loại như thế này trong Coq trong "Cơ sở hạ tầng cho quyền hạn lặp" ( , giấy ).


6

Một trong những điều đầu tiên Coq làm là xây dựng nguyên tắc cảm ứng liên quan đến loại quy nạp mà bạn vừa xác định và hiểu nguyên tắc cảm ứng cơ bản là một bài tập tốt.

Ví dụ O : nat | S : nat -> natsẽ tạo ra nguyên tắc cảm ứng P O -> (∀ n, P n -> P (S n)) -> ∀ n, P n.

Nguyên lý cảm ứng tương ứng là iotagì? Dường như không có vị ngữ Pmà sẽ có thể để nói về P tP (iota t), bởi vì nó nên nói chuyện về exptree a, exptree (exptree a), exptree (exptree (exptree a))...

Cũng Omicronlàm điều tương tự nhưng loại nhỏ hơn mỗi lần. Bạn nên cảm thấy rằng việc tham chiếu đến cả loại nhỏ hơn và loại lớn hơn sẽ khiến mọi thứ trở nên lộn xộn. (Điều đó nói rằng, Omicronlà cách đúng đắn)

Đó không phải là tiêu chí chính xác nói rằng tại sao định nghĩa không nên được chấp nhận nhưng điều này giải thích tại sao nó cảm thấy sai đối với tôi.

exptreecó vẻ như bạn đang xây dựng một ngữ pháp cho các biểu thức, điều mà thường không phải đệ quy. Bạn có muốn giúp đỡ với điều đó?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.