Ich versuche, das folgende Agda-Snippet in Coq zu schreiben.Coq Inferenz Verhalten
open import Data.Fin using (Fin; suc; zero)
open import Data.Nat using (ℕ; suc; zero)
thin : {n : ℕ} -> Fin (suc n) -> Fin n -> Fin (suc n)
thin zero y = suc y
thin (suc x) zero = zero
thin (suc x) (suc y) = suc (thin x y)
Ich dachte, das ohne weiteres zu Coq übersetzt werden könnte wie:
Inductive Fin : nat -> Type :=
| fz {n : nat} : Fin (S n)
| fs {n : nat} : Fin n -> Fin (S n).
Fixpoint thin {n : nat} (x : Fin (S n)) (y : Fin n) : Fin (S n) :=
match x, y with
| fz, y' => fs y'
| (fs x'), fz => fz
| (fs x'), (fs y') => fs (thin x' y')
end.
Dies führt jedoch zu dem folgenden Fehler:
Toplevel input, characters 171-173:
Error:
In environment
thin : forall n : nat, Fin (S n) -> Fin n -> Fin (S n)
n : nat
x : Fin (S n)
y : Fin n
n0 : nat
x' : Fin n0
n1 : nat
y' : Fin n1
The term "x'" has type "Fin n0" while it is expected to have type
"Fin (S ?n1)".
Ich glaube, Coq Figur Lage sein sollte, out den impliziten Parameter n
so habe ich keine Ahnung, was vor sich geht. Ich denke, mir ist ein Unterschied zwischen den Typsystemen von Agda und Coq nicht bewusst, da die früheren Typchecks gut waren.
Pattern-Matching in Coq ist nicht so mächtig wie in Agda. IIRC, können Sie Coq helfen, indem Sie "Fin" durch Rekursion definieren. Versuchen Sie [this] (http://lpaste.net/162317) zu übersetzen. – user3237465