Документация о классах типов в Изабель (раздел 3.5) объясняет, как определять дополнительные отношения подкласса "по факту", предоставляя доказательства отсутствующих аксиом.Есть ли способ сделать это, когда подкласс добавляет параметры в дополнение к аксиомам?
Например, предположим, что у меня есть следующие классы:
class setoid =
fixes eq :: "'a ⇒ 'a ⇒ bool" (infix "≈" 50)
assumes eq_refl : "∀x. x ≈ x"
and eq_symm : "∀x y. x ≈ y ⟶ y ≈ x"
and eq_trans : "∀x y z. x ≈ y ⟶ y ≈ z ⟶ x ≈ z"
class preorder =
fixes le :: "'a ⇒ 'a ⇒ bool" (infix "≲" 50)
assumes le_refl : "∀x. x ≲ x"
and le_trans : "∀x y z. x ≲ y ⟶ y ≲ z ⟶ x ≲ z"
Каждый предзаказ должен быть сетоидом, когда мысимметризовать его неравенство:
definition (in preorder) peq :: "'a ⇒ 'a ⇒ bool"
where "peq x y ≡ (x ≲ y) ∧ (y ≲ x)"
Однако следующее не удается:
subclass (in preorder) setoid
с ошибкой exception TYPE raised: Class preorder lacks parameter(s) "setoid_class.eq" of setoid
.Но я не могу понять синтаксис, чтобы сказать Изабель, что этот пропущенный параметр должен быть отношением peq
, которое я определил.
Я могу сделать это, если перейду к локали вместо классов типов (доказательства опущены длякраткость):
interpretation peq_class : setoid peq
proof
show "∀x. peq x x" sorry
show "∀x y. peq x y ⟶ peq y x" sorry
show "∀x y z. peq x y ⟶ peq y z ⟶ peq x z" sorry
qed
Но это не позволяет мне использовать preorder
в качестве setoid
, то есть interpretation
не действует как subclass
или instantiation
,Я хочу иметь возможность создавать экземпляр типа как предзаказ, а затем автоматически использовать определения и теоремы о сетоидах для этого типа путем симметризации его неравенства.Как мне этого добиться?