Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

652 remove superscripts from rec constr #655

Open
wants to merge 27 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
33b6794
Add ToRecord class and instances
carlostome Jan 28, 2025
38b46db
Remove constructor from PState
carlostome Jan 28, 2025
8795c94
Remove constructor from GState
carlostome Jan 28, 2025
ad685cc
Remove constructor from DelegEnv
carlostome Jan 28, 2025
83e69c1
Remove constructor from DState
carlostome Jan 28, 2025
659ce9b
Remove constructor from CertEnv
carlostome Jan 28, 2025
dea0de3
Remove constructor from UTxOState
carlostome Jan 29, 2025
3d459cc
Remove constructor from RatifyState
carlostome Jan 30, 2025
e02f1db
Remove constructor from EnactEnv
carlostome Jan 30, 2025
5501240
Remove constructor from Acnt
carlostome Jan 31, 2025
565378f
Remove constructor from NewPParamState
carlostome Jan 31, 2025
04f692f
Remove constructor from LEnv
carlostome Jan 31, 2025
6a2b644
Remove constructor from GovEnv
carlostome Feb 3, 2025
dcb2028
Remove constructor from EpochState
carlostome Feb 3, 2025
e71e00e
Remove constructor from NewEpochState
carlostome Feb 4, 2025
494309f
Remove constructor from Snapshot
carlostome Feb 4, 2025
9b21f2f
Remove constructor from Snapshots
carlostome Feb 4, 2025
6f7c434
Disable vertical vectors for now
carlostome Feb 4, 2025
03843bb
Remove constructor from RewardUpdate
carlostome Feb 4, 2025
8b8148e
Remove constructor from CertState
carlostome Feb 5, 2025
ddfefed
Move ToRecord to Class.To; add metaprogram to derive instances
carlostome Feb 5, 2025
abf7ca1
Merge branch 'master' into 652-remove-superscripts-from-rec-constr
williamdemeo Feb 5, 2025
6e0b41d
Remove constructors from records in Conformance
carlostome Feb 6, 2025
dfd6b2f
Merge branch 'master' into HEAD
carlostome Feb 6, 2025
ccb2576
Change implementation of `getCodPi` to strip only the fst abstraction
carlostome Feb 6, 2025
59486cd
Address Andre's comments
carlostome Feb 6, 2025
29622b6
Handle correctly the empty record case
carlostome Feb 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 107 additions & 0 deletions src/Class/To.agda
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
{-# OPTIONS --safe #-}
module Class.To where

record To (X : Set) (Y : Set) : Set where
field
⟦_⟧ : X → Y
infix 5 ⟦_⟧

open To ⦃...⦄ public

-- Metaprogram to derive instances
open import Data.List.NonEmpty as NE using (List⁺; _∷_)
open import Data.List
open import Meta
open import MetaPrelude
open import Reflection.Tactic
open import Reflection.Utils.Debug

open import Class.MonadTC
open import Class.Monad
open import Class.Functor
open import Class.Traversable

open import Data.Product.Nary.NonDependent using (uncurryₙ)

open MonadTCI

getCodPi : Type → Type
getCodPi ty =
carlostome marked this conversation as resolved.
Show resolved Hide resolved
let as , ty_v = stripPis ty
in unbumpTerm (length as) ty_v
where
-- readjust De Bruijn indexes
unbumpTerm : ℕ → Term → Term
unbumpArg : ℕ → Arg Term → Arg Term
unbumpArgs : ℕ → List (Arg Term) → List (Arg Term)

unbumpTerm n (var n' args) = var (n' ∸ n) (unbumpArgs n args)
unbumpTerm n (con c args) = con c (unbumpArgs n args)
unbumpTerm n (def f args) = def f (unbumpArgs n args)
unbumpTerm n d = d

unbumpArg n (arg i x) = arg i (unbumpTerm n x)

unbumpArgs n [] = []
unbumpArgs n (x ∷ xs) = unbumpArg n x ∷ unbumpArgs n xs

-- Map a nonempty record def. to
-- 1. its constructor
-- 2. the type of its fields
-- 3. the number of fields
fromNERecDef : Definition → TC (Name × List⁺ Type × ℕ)
carlostome marked this conversation as resolved.
Show resolved Hide resolved
fromNERecDef (record′ c (f ∷ fs)) =
do ty ← fmap ⦃ Functor-M ⦄ getCodPi (getType (unArg f))
tys ← traverse (λ f → fmap ⦃ Functor-M ⦄ getCodPi (getType (unArg f))) fs
return (c , ty ∷ tys , 1 + length fs)
fromNERecDef (record′ c []) = typeError [ strErr "Expected a nonempty record type" ]
fromNERecDef d = typeError [ strErr "Expected a record type" ]

getRecConstrName : Name → TC Name
getRecConstrName rn =
carlostome marked this conversation as resolved.
Show resolved Hide resolved
do d ← getDefinition rn
case d of λ where
(record′ c _) → return c
_ → typeError [ strErr "Expected a record got something else" ]

-- Derive instance of To
derive-To-single : Name -- name of the record type
→ Name -- name of the instance to be defined
→ TC ⊤
derive-To-single recTyName instName =
do To-ctrName ← getRecConstrName (quote To)
recDef ← getDefinition recTyName
(ctrName , fTys , nfs) ← fromNERecDef recDef
arity ← quoteTC nfs
arity' ← normalise arity
let tyProd = NE.foldr₁ (λ ty tys → (quote _×_) ∙⟦ ty ∣ tys ⟧) fTys
let defTm = (quote To) ∙⟦ tyProd ∣ recTyName ∙ ⟧
let instTm = To-ctrName ◆⟦ quote uncurryₙ ∙⟦ arity' ∣ ctrName ◆ ⟧ ⟧
declareDef (iArg instName) defTm
defineFun instName [ ⟦⇒ instTm ⟧ ]

module _ ⦃ _ : TCOptions ⦄ where
derive-To : List (Name × Name) → UnquoteDecl
derive-To rcs = initUnquoteWithGoal (quote To ∙) (traverse (uncurry derive-To-single) rcs >> return tt)

-- Example usage
private
record R : Set where
field r : Bool

record R' : Set where
field x : Bool
y : ℕ

unquoteDecl To-R To-R' = derive-To ⦃ defaultTCOptions ⦄ ((quote R , To-R) ∷ (quote R' , To-R') ∷ [])

p : R
p = ⟦ true ⟧

module _ (x : Set) where
record R'' : Set where
field a : ℕ
b c : Bool

instance
unquoteDecl To-R'' = derive-To ⦃ defaultTCOptions ⦄ ((quote R'' , To-R'') ∷ [])
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still trying to understand how the metaprogramming logic works, so I won't comment on this part of the PR.

65 changes: 34 additions & 31 deletions src/Ledger/Certs.lagda
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,6 @@ cwitness (reg c (suc _)) = just c
record CertEnv : Type where
\end{code}
\begin{code}[hide]
constructor ⟦_,_,_,_,_⟧ᶜ
field
\end{code}
\begin{code}
Expand All @@ -107,7 +106,6 @@ record CertEnv : Type where
record DState : Type where
\end{code}
\begin{code}[hide]
constructor ⟦_,_,_⟧ᵈ
field
\end{code}
\begin{code}
Expand All @@ -121,7 +119,6 @@ record DState : Type where
record PState : Type where
\end{code}
\begin{code}[hide]
constructor ⟦_,_⟧ᵖ
field
\end{code}
\begin{code}
Expand All @@ -134,7 +131,6 @@ record PState : Type where
record GState : Type where
\end{code}
\begin{code}[hide]
constructor ⟦_,_⟧ᵛ
field
\end{code}
\begin{code}
Expand All @@ -144,7 +140,6 @@ record GState : Type where
record CertState : Type where
\end{code}
\begin{code}[hide]
constructor ⟦_,_,_⟧ᶜˢ
field
\end{code}
\begin{code}
Expand All @@ -155,7 +150,6 @@ record CertState : Type where
record DelegEnv : Type where
\end{code}
\begin{code}[hide]
constructor ⟦_,_,_⟧ᵈᵉ
field
\end{code}
\begin{code}
Expand All @@ -180,6 +174,15 @@ instance
\end{code}

\begin{code}[hide]
instance
unquoteDecl To-CertEnv To-DState To-PState To-GState To-CertState To-DelegEnv = derive-To
( (quote CertEnv , To-CertEnv)
∷ (quote DState , To-DState)
∷ (quote PState , To-PState)
∷ (quote GState , To-GState)
∷ (quote CertState , To-CertState)
∷ [ (quote DelegEnv , To-DelegEnv) ])

private variable
rwds rewards : Credential ⇀ Coin
dReps : Credential ⇀ Epoch
Expand Down Expand Up @@ -335,24 +338,24 @@ data _⊢_⇀⦇_,DELEG⦈_ where
fromList ( nothing ∷ just abstainRep ∷ just noConfidenceRep ∷ [] )
∙ mkh ∈ mapˢ just (dom pools) ∪ ❴ nothing ❵
────────────────────────────────
⟦ pp , pools , delegatees ⟧ᵈᵉ ⊢ ⟦ vDelegs , sDelegs , rwds ⟧
⟦ pp , pools , delegatees ⟧ ⊢ ⟦ vDelegs , sDelegs , rwds ⟧
⇀⦇ delegate c mv mkh d ,DELEG⦈
⟦ insertIfJust c mv vDelegs , insertIfJust c mkh sDelegs , rwds ∪ˡ ❴ c , 0 ❵ ⟧
⟦ insertIfJust c mv vDelegs , insertIfJust c mkh sDelegs , rwds ∪ˡ ❴ c , 0 ❵ ⟧

DELEG-dereg :
∙ (c , 0) ∈ rwds
────────────────────────────────
⟦ pp , pools , delegatees ⟧ᵈᵉ ⊢ ⟦ vDelegs , sDelegs , rwds ⟧ ⇀⦇ dereg c md ,DELEG⦈
⟦ vDelegs ∣ ❴ c ❵ ᶜ , sDelegs ∣ ❴ c ❵ ᶜ , rwds ∣ ❴ c ❵ ᶜ ⟧
⟦ pp , pools , delegatees ⟧ ⊢ ⟦ vDelegs , sDelegs , rwds ⟧ ⇀⦇ dereg c md ,DELEG⦈
⟦ vDelegs ∣ ❴ c ❵ ᶜ , sDelegs ∣ ❴ c ❵ ᶜ , rwds ∣ ❴ c ❵ ᶜ ⟧
\end{code}
\begin{code}[hide]
DELEG-reg : let open PParams pp in
∙ c ∉ dom rwds
∙ d ≡ keyDeposit ⊎ d ≡ 0
────────────────────────────────
⟦ pp , pools , delegatees ⟧ᵈᵉ
⟦ vDelegs , sDelegs , rwds ⟧ ⇀⦇ reg c d ,DELEG⦈
⟦ vDelegs , sDelegs , rwds ∪ˡ ❴ c , 0 ❵ ⟧
⟦ pp , pools , delegatees ⟧ ⊢
⟦ vDelegs , sDelegs , rwds ⟧ ⇀⦇ reg c d ,DELEG⦈
⟦ vDelegs , sDelegs , rwds ∪ˡ ❴ c , 0 ❵ ⟧
\end{code}
\end{AgdaSuppressSpace}
\caption{Auxiliary DELEG transition system}
Expand All @@ -369,12 +372,12 @@ data _⊢_⇀⦇_,POOL⦈_ where
POOL-regpool :
∙ kh ∉ dom pools
────────────────────────────────
pp ⊢ ⟦ pools , retiring ⟧ ⇀⦇ regpool kh poolParams ,POOL⦈
⟦ ❴ kh , poolParams ❵ ∪ˡ pools , retiring ⟧
pp ⊢ ⟦ pools , retiring ⟧ ⇀⦇ regpool kh poolParams ,POOL⦈
⟦ ❴ kh , poolParams ❵ ∪ˡ pools , retiring ⟧

POOL-retirepool :
────────────────────────────────
pp ⊢ ⟦ pools , retiring ⟧ ⇀⦇ retirepool kh e ,POOL⦈ ⟦ pools , ❴ kh , e ❵ ∪ˡ retiring ⟧
pp ⊢ ⟦ pools , retiring ⟧ ⇀⦇ retirepool kh e ,POOL⦈ ⟦ pools , ❴ kh , e ❵ ∪ˡ retiring ⟧
\end{code}
\end{AgdaSuppressSpace}
\caption{Auxiliary POOL transition system}
Expand All @@ -391,19 +394,19 @@ data _⊢_⇀⦇_,GOVCERT⦈_ where
GOVCERT-regdrep : ∀ {pp} → let open PParams pp in
∙ (d ≡ drepDeposit × c ∉ dom dReps) ⊎ (d ≡ 0 × c ∈ dom dReps)
────────────────────────────────
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys ⟧ ⇀⦇ regdrep c d an ,GOVCERT⦈
⟦ ❴ c , e + drepActivity ❵ ∪ˡ dReps , ccKeys ⟧
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys ⟧ ⇀⦇ regdrep c d an ,GOVCERT⦈
⟦ ❴ c , e + drepActivity ❵ ∪ˡ dReps , ccKeys ⟧

GOVCERT-deregdrep :
∙ c ∈ dom dReps
────────────────────────────────
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys ⟧ ⇀⦇ deregdrep c d ,GOVCERT⦈ ⟦ dReps ∣ ❴ c ❵ ᶜ , ccKeys ⟧
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys ⟧ ⇀⦇ deregdrep c d ,GOVCERT⦈ ⟦ dReps ∣ ❴ c ❵ ᶜ , ccKeys ⟧

GOVCERT-ccreghot :
∙ (c , nothing) ∉ ccKeys
∙ c ∈ cc
────────────────────────────────
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys ⟧ ⇀⦇ ccreghot c mc ,GOVCERT⦈ ⟦ dReps , ❴ c , mc ❵ ∪ˡ ccKeys ⟧
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys ⟧ ⇀⦇ ccreghot c mc ,GOVCERT⦈ ⟦ dReps , ❴ c , mc ❵ ∪ˡ ccKeys ⟧
\end{code}
\end{AgdaSuppressSpace}
\caption{Auxiliary GOVCERT transition system}
Expand Down Expand Up @@ -431,19 +434,19 @@ data _⊢_⇀⦇_,CERT⦈_ where
\end{code}
\begin{code}
CERT-deleg :
∙ ⟦ pp , PState.pools stᵖ , dom (GState.dreps stᵍ) ⟧ᵈᵉ ⊢ stᵈ ⇀⦇ dCert ,DELEG⦈ stᵈ'
∙ ⟦ pp , PState.pools stᵖ , dom (GState.dreps stᵍ) ⟧ ⊢ stᵈ ⇀⦇ dCert ,DELEG⦈ stᵈ'
────────────────────────────────
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ᶜˢ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ' , stᵖ , stᵍ ⟧ᶜˢ
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ' , stᵖ , stᵍ ⟧

CERT-pool :
∙ pp ⊢ stᵖ ⇀⦇ dCert ,POOL⦈ stᵖ'
────────────────────────────────
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ᶜˢ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ , stᵖ' , stᵍ ⟧ᶜˢ
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ , stᵖ' , stᵍ ⟧

CERT-vdel :
∙ Γ ⊢ stᵍ ⇀⦇ dCert ,GOVCERT⦈ stᵍ'
────────────────────────────────
Γ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ᶜˢ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ , stᵖ , stᵍ' ⟧ᶜˢ
Γ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ , stᵖ , stᵍ' ⟧
\end{code}
\end{AgdaSuppressSpace}
\emph{CERTBASE transition}
Expand All @@ -463,15 +466,15 @@ data _⊢_⇀⦇_,CERTBASE⦈_ where
∙ filter isKeyHash wdrlCreds ⊆ dom voteDelegs
∙ mapˢ (map₁ stake) (wdrls ˢ) ⊆ rewards ˢ
────────────────────────────────
⟦ e , pp , vs , wdrls , cc ⟧
⟦ ⟦ voteDelegs , stakeDelegs , rewards ⟧
⟦ e , pp , vs , wdrls , cc ⟧ ⊢
⟦ ⟦ voteDelegs , stakeDelegs , rewards ⟧
, stᵖ
, ⟦ dReps , ccHotKeys ⟧
ᶜˢ ⇀⦇ _ ,CERTBASE⦈
⟦ ⟦ validVoteDelegs , stakeDelegs , constMap wdrlCreds 0 ∪ˡ rewards ⟧
, ⟦ dReps , ccHotKeys ⟧
⟧ ⇀⦇ _ ,CERTBASE⦈
⟦ ⟦ validVoteDelegs , stakeDelegs , constMap wdrlCreds 0 ∪ˡ rewards ⟧
, stᵖ
, ⟦ refreshedDReps , ccHotKeys ⟧
ᶜˢ
, ⟦ refreshedDReps , ccHotKeys ⟧
carlostome marked this conversation as resolved.
Show resolved Hide resolved
\end{code}
\end{AgdaSuppressSpace}
\caption{CERTS rules}
Expand Down
Loading