제목은별로 유익하지 않으므로 설명해 드리겠습니다.목록 X의 길이를 Coq의 X 생성자에 대한 인수로 사용
나는 1 차 논리에서 용어라는 것을 의미하는 것을 공식화하려하고있다. 다음은 임의의 언어 L
측면의 교과서 정의입니다 :
(1) Each variable or constant is a term.
(2) If n ≥ 1, f is an n-ary function of L, and t1 ... tn are terms of L, then f t1 ... tn is a term of L.
는 이미 변수, 상수, 함수 및 언어 정의 var
, const
, func
및 lang
있다. 함수의 아티 (arity)와 언어의 모든 함수의 앙상블을 각각 반환하는 함수 f_arity
및 L_funcs
도 있습니다. 귀납적 인 용어 정의를주는 것은 매우 간단합니다.
그러나 작동하지 않습니다. 대신,이 오류 메시지가 나타납니다.
Error: Non strictly positive occurrence of "term" in
"forall (f : func) (l : list (term L)),
length l = f_arity f -> In func (L_funcs L) f -> term L".
여기에 무슨 일이 일어나고 있는지 모호한 생각이 있습니다. 생성자 t_f
에는 length l = f_arity
이라는 인수가 있습니다. Coq는 화살표 왼쪽에 term L
을 가지고 있기 때문에 좋지 않습니다. 하지만 Coq가 지나치게 조심스럽게 여기고 있다고 생각합니다. 유형을 조금만 조정하면 똑같은 일을 할 수 있기 때문입니다. 예를 들어, 사용자 정의 목록 유형 listN
을 으로 인덱싱하여 list X n
이 X
이고 목록이 n
인 것으로 정의 할 수 있습니다. 그럼 난
Inductive term (L : lang) : Type :=
| t_v : var -> term L
| t_c : const -> term L
| t_f : forall (f : func)
(l : listN (term L) (f_arity f)),
In func (L_funcs L) f -> term L .
있을 것입니다하지만 임시, 모든 유용한 목록을 사용할 수 없게 도서관 만들기 때문에 나는이 길을 가고 싶어하지 않습니다. 그래서 나는 Coq에게 내가하려고하는 것이 완벽하게 안전하다는 것을 납득시킬 방법을 찾고있다. 그래서 생성자 인자로 length l = f_arity f
을 받아 들일 것이다. 이것을 할 수있는 방법이 있습니까?