Coq에서 동형 클래스를 정의하는 방법?Coq에서 동형 클래스 정의하기
가정하자 나는 기록 ToyRec 있습니다
Record ToyRec {Labels : Set} := {
X:Set;
r:X->Labels
}.
그리고 전단 사 함수 f를가 존재하는 경우이 객체의 T1 및 T2는 동형 것을 주장 유형 ToyRec 두 개체 사이의 isomorphisms의 정의 :. T1을 (X) -> T2. (X)는 매핑 된 요소의 레이블을 유지합니다.
Definition Isomorphic{Labels:Set} (T1 T2 : @ToyRec Labels) : Prop :=
exists f:T1.(X)->T2.(X), (forall x1 x2:T1.(X), f x1 <> f x2) /\
(forall x2:T2.(X), exists x1:T1.(X), f x1 = f x2) /\
(forall x1:T1.(X) T1.(r) x1 = T2.(r) (f x1)).
는 지금은 T1 동형 모든 객체를 포함한 세트 을 객체 T1을 받아 반환하는 함수를 정의하고 싶습니다.
g(T1) = {T2 | Isomorphic T1 T2}
어떻게 이런 일을 coq에서합니까? 나는 이론적으로도 이론적으로이 논리를 가지고 있을지도 모른다는 것을 알고있다. 그러나 동형체 클래스의 올바른 유형의 이론적 인 개념은 무엇인가? 아니면 더 근본적으로, 어떻게 주어진 속성을 만족하는 모든 엘레 넷의 집합 (또는 유형)을 정의 할 수 있을까요?
원하는대로 할 수 있는지 모르겠다. 어떻게하면이 집합을 건설적으로 구축 할 수 있는지, 가능한 모든 기능을이 열거 형에 열거해야하는지, 이것이 불가능한 것 같아 보인다. – Vinz
'forall x y, f x = f y -> x = y' 또는 forall x y, x <> y -> f x <> f y'이어야합니다. 이과 성은'forall y, exist x, f x = y'이어야합니다. 'for x y : T, f x <> f y'는 'T'가 비어 있지 않으면 항상 거짓입니다. 'forall y, exists x, f x = f y'는 항상 참입니다. –
타입 이론에서 이론을 설정하려고하는 것처럼 보입니다. 세트 대신 술어로 작업 해보십시오. –