Вот реализация, которую я предлагаю:
open import Data.Unit
open import Data.Product renaming (_,_ to ⟨_,_⟩)
open import Data.Sum
open import Function
Измените определение Subset
на go на Set
вместо Bool
. Я знаю, что это может быть спорным, но в моем опыте это всегда путь к go, а также это как подмножества реализованы в стандартной библиотеке. (Кстати, если вам интересно увидеть реализацию в стандартной библиотеке, она находится в файле Relation / Unary.agda). Я также удалил уровни вселенной, поскольку вы не использовали их в своих более поздних определениях, что привело меня к очистке типов модуля.
Subset : Set → Set₁
Subset A = A → Set
Соответственно изменилось определение членства.
_∈_ : ∀ {A} → A → Subset A → Set
a ∈ P = P a
Relation : ∀ A B → Set₁
Relation A B = Subset (A × B)
Тогда диапазон становится очень естественным: b
находится в диапазоне R
, если они существуют, например, R
из a
и b
.
Range : ∀ {A B} → Relation A B → Subset B
Range R b = ∃ (R ∘ ⟨_, b ⟩) -- equivalent to ∃ \a → R ⟨ a , b ⟩
_⊆_ : ∀ {A} → Subset A → Subset A → Set
A ⊆ B = ∀ x → x ∈ A → x ∈ B
Не много, чтобы сказать о целом наборе
wholeSet : ∀ A → Subset A
wholeSet _ _ = ⊤
∀subset⊆set : ∀ {A sub} → sub ⊆ wholeSet A
∀subset⊆set _ _ = tt
_∩_ : ∀ {A} → Subset A → Subset A → Subset A
(A ∩ B) x = x ∈ A × x ∈ B
Доказательство включения диапазона сделано очень естественно с этим определением.
⊆-range-∩ : ∀ {A B} {F G : Relation A B} → Range (F ∩ G) ⊆ (Range F ∩ Range G)
⊆-range-∩ _ ⟨ a , ⟨ Fab , Gab ⟩ ⟩ = ⟨ ⟨ a , Fab ⟩ , ⟨ a , Gab ⟩ ⟩
Я также взял свобода добавлять соответствующие свойства о союзе.
_⋃_ : ∀ {A} → Subset A → Subset A → Subset A
(A ⋃ B) x = x ∈ A ⊎ x ∈ B
⋃-range-⊆ : ∀ {A B} {F G : Relation A B} → (Range F ⋃ Range G) ⊆ Range (F ⋃ G)
⋃-range-⊆ _ (inj₁ ⟨ a , Fab ⟩) = ⟨ a , inj₁ Fab ⟩
⋃-range-⊆ _ (inj₂ ⟨ a , Gab ⟩) = ⟨ a , inj₂ Gab ⟩