Я рассматриваю возможность написания программы Coq для проверки определенных свойств relational algebra. У меня есть некоторые из основных типов данных, но конкатенация кортежей дает мне некоторые проблемы.Неопределенный список в Coq
Вот соответствующий раздел кода:
Require Import List.
Require Import String.
(* An enum representing SQL types *)
Inductive sqlType : Set := Nat | Bool.
(* Defines a map from SQL types (which are just enum values) to Coq types. *)
Fixpoint toType (t : sqlType) : Set :=
match t with
| Nat => nat
| Bool => bool
end.
(* A column consists of a name and a type. *)
Inductive column : Set :=
| Col : string -> sqlType -> column.
(* A schema is a list of columns. *)
Definition schema : Set := list column.
(* Concatenates two schema together. *)
Definition concatSchema (r : schema) (s : schema) : schema := app r s.
(* Sends a schema to the corresponding Coq type. *)
Fixpoint tuple (s : schema) : Set :=
match s with
| nil => unit
| cons (Col str t) sch => prod (toType t) (tuple sch)
end.
Fixpoint concatTuples {r : schema} {s : schema} (a : tuple r) (b : tuple s) : tuple (concatSchema r s) :=
match r with
| nil => b
| cons _ _ => (fst a , concatTuples (snd a) b)
end.
В функции concatTuples, в ноль случае CoqIDE дает мне ошибку:
"The term "b" has type "tuple s" while it is expected to have type "tuple (concatSchema ?8 s)"."
Я думаю, что я понимаю, что там происходит ; контролер типа не может определить, что s
и concatSchema nil s
равны. Но что я нахожу страннее, что когда я добавить следующую строку:
Definition stupid {s : schema} (b : tuple s) : tuple (concatSchema nil s) := b .
и изменить дело nil => stupid b
, это работает. (Ну, это все еще жалуется на случае минусов, но я думаю, что означает, что он принимая ноль случая.)
У меня есть три вопроса по этому поводу:
- Есть ли способ устранить
stupid
? Кажется, что Coq знает, что типы равны, ему просто нужен какой-то намек. - Как я могу сделать дело «против»? У меня много проблем с записью функции
stupid
. - Это даже правильный подход к гетерогенным спискам? Мне кажется, что это самый простой для меня, но у меня очень свободное понимание Карри-Говарда, и то, что на самом деле означает код Coq.
Я постараюсь избежать так много, erm, «type variature». – Atsby
Что именно вы подразумеваете под этим? –