Я пытаюсь определить тип данных с помощью конструктора, который принимает список, и включает предложения об этом списке.
Это прекрасно работает:
Require Import Coq.Lists.List.
Import ListNotations.
Inductive Foo := MkFoo : list Foo -> Foo.
И вот так:
Inductive Foo := MkFoo : forall (l : list Foo), Foo.
Но это не удается
Inductive Foo := MkFoo : forall (l : list Foo), l <> [] -> Foo.
с
Non strictly positive occurrence of "Foo"
in "forall l : list Foo, l <> [] -> Foo".
Я предполагаю, что это потому, что []
на самом деле @nil Foo
и Coq не нравится это появление Foo
.
В настоящее время я работаю над этим, используя вектор, например
Require Import Coq.Vectors.Vector.
Inductive Foo := MkFoo : forall n (l : Vector.t Foo n), n <> 0 -> Foo.
, но осложнения, которые возникают из-за использованиязависимых структур данных в Coq заставляет меня задуматься:
Есть ли способ использовать простые списки в MkFoo
и по-прежнему включать предложения об этом списке?