{-# OPTIONS --cubical-compatible --safe #-}
module Forcing.Base where

open import Level
open import Data.Sum
open import Data.Product
open import Relation.Unary

record ForcingNotion : Set₁ where
  field
    L       : Set
    _≼_     : L  L  Set
    ≼-refl  : {x : L}  x  x
    ≼-trans : {x y z : L}  x  y  y  z  x  z
    Cov     : L  Set
    _◁_     : {x : L}  (a : L)  (R : Cov x)  Set
    ◁⇒≼     : {x y : L} {R : Cov x}  y  R  y  x
    stable  : {x y : L}  y  x  (R : Cov x)  Σ[ S  Cov y ] ({a : L}  a  S  Σ[ b  L ] (a  b × b  R))

record Filter (L… : ForcingNotion) : Set₁ where
  open ForcingNotion L…

  field
    F                  : Pred L 0ℓ
    upward-closed      : {x y : L}  y  x  F y  F x
    downward-directed₁ : Σ[ x  L ] F x
    downward-directed₂ : {a b : L}  F a  F b  Σ[ x  L ] x  a × x  b × F x
    split              : {x : L} {R : Cov x}  F x  Σ[ y  L ] F y × y  R