Руководство по очень мелкому встраиванию VHDL в AGDA, часть II

Привет, я задал вопрос, касающийся моего проекта, я работал над ним и добился следующих успехов:

module project1 where

open import Data.Empty

open import Data.Unit hiding (_≟_)
open import Data.Nat hiding (_≟_; _⊔_)
open import Data.String
open import Data.List
open import Data.Vec hiding (_∈_)

open import Data.Sum
open import Data.Product
open import Function
open import Relation.Nullary
open import Relation.Binary

open import Relation.Binary.PropositionalEquality

open import Data.Vec hiding (_∈_)

data Bool : Set where
  true  : Bool
  false : Bool

-- The definition of a circuit and series and parallel combination of the circuit
data Ckt   :  Set where
  bool     : Bool → Ckt
  gate     : ℕ → ℕ → Ckt
  series   : Ckt → Ckt → Ckt
  parallel : Ckt → Ckt → Ckt


And : Ckt
And = gate 2 1

Not :  Ckt
Not = gate 1 1

Or : Ckt
Or = gate 2 1

Nand : Ckt
Nand = gate 2 1

Nand₁ : Ckt
Nand₁ = series And Not 


--Static Semantics


data Ctxt : Set where
  □   : Ctxt


data _⊢_  : (Γ : Ctxt) → (e : Ckt)  → Set where

  BoolT     : ∀ {Γ b} → Γ ⊢ bool b 
  GateT     : ∀ {Γ i o} →  Γ ⊢ gate  i o
  SeriesT   : ∀ {Γ c₁ c₂} →  Γ ⊢ c₁ → Γ ⊢ c₂  → Γ ⊢ series  c₁ c₂ 
  ParallelT : ∀ {Γ c₁ c₂} →  Γ ⊢ c₁ → Γ ⊢ c₂  → Γ ⊢ parallel  c₁ c₂

--dynamic semantics

--The type of input and output from the dynamics
in/out =   List Bool 

--closure is made up if the ckt and input/output
ClosureL : Set
ClosureL =   Ckt × in/out  


data FrameL  : Set where
  SeriesLK   : ClosureL → FrameL
  ParallelLK : ClosureL → FrameL
  SeriesRK   : in/out → FrameL
  ParallelRk : in/out → FrameL

ContL : Set
ContL = List FrameL


data StateL : Set where
  Enter : ClosureL → ContL → StateL
  Return : ContL → in/out → StateL

stepL : StateL → StateL
stepL (Enter (bool b , ρ) κ) = Return κ {!!}
stepL (Enter (gate i o , ρ) κ) = Return κ {!!}
stepL (Enter (series c₁ c₂ , ρ) κ) = Enter (c₁ , ρ) (SeriesLK (c₂ , ρ) ∷  κ)
stepL (Enter (parallel c₁ c₂ , ρ) κ) =  Enter (c₁ , ρ) (ParallelLK (c₂ , ρ) ∷  κ)

stepL (Return [] output) = Return [] output

stepL (Return (SeriesLK (e₂ , ρ) ∷ κ) output) = Enter (e₂ , {!!}) {!!} 

stepL (Return (ParallelLK (e₂ , ρ) ∷ κ) output) =  Enter (e₂ , {!!}) {!!} 

stepL (Return (SeriesRK x  ∷ κ) output) = {!!}
stepL (Return (ParallelRk x ∷ κ) output) = {!!}

Моя проблема здесь в динамической семантике. Как я гарантирую, что вход для машины CEK (модифицированный cek, потому что ее вход и стек ckt вместо ckt env и stack) и выход имеют ту же длину, что и указанная схемой. Я коротко, как я могу указать длину списка ввода / вывода при предоставлении его в качестве ввода на машину? Пожалуйста, не стесняйтесь указывать на любые другие проблемы, которые вы видите в моем коде.

0 ответов

Другие вопросы по тегам