Я доказал много теорем, начиная с действительных аксиом, теперь я хочу определить Naturals как подмножество вещественных чисел и повторно использовать все доказанные теоремы. Как это можно сделать? Вот искусственное MRE, которое компилируется с использованием надлежащих методов проектирования coq:
01 (* CReal Definitions *)
02 Parameter CReal: Set.
03 Parameter creal_add : CReal -> CReal -> CReal.
04 Axiom creal_comm: forall x y:CReal, creal_add x y = creal_add y x.
05
06 (* CNat Definitions *)
07 Parameter CNat: Set.
08 Theorem cnat_comm: forall x y:CNat, creal_add x y = creal_add y x.
09 Proof. exact creal_comm. Qed. (* Should be OK after subclassing *)
Теперь он жалуется на то, что O является CReal вместо CNat, поэтому было бы здорово, если бы x был полиморфно интерпретирован как CReal, чтобы иметь возможность сравнивать против других CReals и применять к ним теоремы и аксиомы CReal в красивой и не запутанной форме.
EDIT :
Чтобы прояснить, что я хочу, вот код, который не должен компилироваться после правильного подкласса:
11 (* CNat Positive *)
12 Parameter O : CReal.
13 Parameter cnat_succ : CNat -> CNat.
14 Axiom cnat_positive: forall (x : CNat), ~cnat_succ x=O.
15
16 (* CReal Wrong Theorem *)
17 Theorem creal_positive: forall x:CReal, ~cnat_succ x=O. (*Crash*)
18 Proof. exact cnat_positive. Qed. (*Also Crash*)
Причина, по которой строки 17 и 18 должны создавать sh, заключается в том, что 17 использует cnat_su cc вместо CReal, но определяется только cnat_su cc для подкласса CNat, а в 18 используется аксиома CNat, которая не должна быть видна суперклассу CReal. Таким образом, аксиомы и теоремы суперкласса должны быть видимы для подкласса и применимы к ним, но не наоборот.