Я изучаю Coq и как упражнение хочу определить тип FnArity (N:nat)
для кодирования все функции N
аргументы. То есть:Тип, содержащий все функции N элементов в Coq
Check FnArity 3 : (forall A B C : Set, A -> B -> C).
Должно работать, но
Check FnArity 2 : (forall A B C D : Set, A -> B -> C -> D).
не должны работать.
Это для педагогических целей, поэтому любые соответствующие ресурсы приветствуются.
EDIT: Из ответов до сих пор я понимаю, что я, вероятно, приближается это неправильно, так вот предложение Я пытаюсь доказать: Сочинение N операторов состава эквивалентно оператору состава, который сочиняет f
и g
где g
ожидает N аргументы. В Haskell-иш условиях:
(.).(.) ... N times ... (.).(.) f g = \a1, .. aN -> f (g (a1, .. , aN))
edit2: С точки зрения Coq:
Definition compose { A B C : Type } (F : C -> B) (G : A -> C) : A -> B :=
fun x => F (G (x)).
Definition compose2 {A1 A2 B C : Type} (F : C -> B) (G : A1 -> A2 -> C)
: A1 -> A2 -> B := fun x y => F (G x y).
Definition compose3 {A1 A2 A3 B C : Type} (F : C -> B) (G : A1 -> A2 -> A3 -> C)
: A1 -> A2 -> A3 -> B := fun x y z => F (G x y z).
(* The simplest case *)
Theorem dual_compose : forall {A B C D : Type} (f: D -> C) (g : A -> B -> D) ,
(compose compose compose) f g = compose2 f g.
Proof. reflexivity. Qed.
Theorem triple_compose : forall {A1 A2 A3 B C : Type} (f: C -> B) (g : A1 -> A2 -> A3 -> C) ,
(compose (compose (compose) compose) compose) f g =
compose3 f g.
То, что я хочу, чтобы определить обобщенную теорему для composeN
.
Вы действительно, кажется, отвечаете на мой вопрос, но я не мог заставить производный тип работать для моей проблемы. Не могли бы вы проверить мои изменения и изменить свой ответ, комментируя это? – fakedrake
@fakedrake В этом случае вам, вероятно, просто нужен тип 'FnArityAux1'. Я посмотрю, смогу ли я что-нибудь придумать. –
И что означает символ '&'. Я предполагаю, что это какой-то инсайдерский экзистенциальный квантификатор, но я не мог найти документацию об этом? – fakedrake