Skip to content

Commit a7ed660

Browse files
committed
add typedefs for spec and state
1 parent 27734a4 commit a7ed660

File tree

4 files changed

+78
-16
lines changed

4 files changed

+78
-16
lines changed

src/JSONFormat.idr

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,25 +36,25 @@ listPairToJSON xs = JArray $ map
3636
(\(a, b) => JObject [("input", JNumber $ cast a), ("output", JNumber $ cast b)]) xs
3737

3838
export
39-
expectNat : JSON -> Maybe Nat
40-
expectNat (JNumber n) = if n < 0 then Nothing
41-
else Just $ Prelude.toNat {a=Int} $ cast n
42-
expectNat _ = Nothing
39+
expectNat : JSON -> Either String Nat
40+
expectNat (JNumber n) = if n < 0 then Left "Expected Nat"
41+
else pure $ Prelude.toNat {a=Int} $ cast n
42+
expectNat _ = Left "Expected Nat"
4343

44-
expectEdges : JSON -> Maybe (Nat, Nat)
44+
expectEdges : JSON -> Either String (Nat, Nat)
4545
expectEdges (JObject [("input", a),("output", b)])= [| MkPair (expectNat a) (expectNat b) |]
46-
expectEdges _ = Nothing
46+
expectEdges _ = Left "expected list of edges"
4747

48-
expectList : JSON -> Maybe (List JSON)
49-
expectList (JArray ls) = Just ls
50-
expectList _ = Nothing
48+
expectList : JSON -> Either String (List JSON)
49+
expectList (JArray ls) = pure ls
50+
expectList _ = Left "expected List"
5151

5252
export
53-
expectListNat : JSON -> Maybe (List Nat)
53+
expectListNat : JSON -> Either String (List Nat)
5454
expectListNat js = expectList js >>= traverse expectNat
5555

5656
export
57-
expectListEdges : JSON -> Maybe (List (Nat, Nat))
57+
expectListEdges : JSON -> Either String (List (Nat, Nat))
5858
expectListEdges js = expectList js >>= traverse expectEdges
5959

6060
public export

src/Main.idr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ import Language.JSON
4949
checkFSM : String -> FSMCheck ()
5050
checkFSM fileContent = do
5151
content <- maybe (Left JSONError) Right (parse fileContent)
52-
fsm <- maybe (Left InvalidFSM) Right (Typedefs.TermParse.deserializeJSON FSMExec
52+
fsm <- either (const $ Left InvalidFSM) Right (Typedefs.TermParse.deserialiseJSON FSMExec
5353
[ (Nat ** expectNat)
5454
, (List (Nat, Nat) ** expectListEdges)
5555
, (List Nat ** expectListNat)
@@ -72,6 +72,6 @@ main = do
7272
content <- (readFile filename)
7373
let asFSMCheck = either (const (Left FSError)) Right content
7474
let checkedFSM = asFSMCheck >>= checkFSM
75-
printLn (TermWrite.serializeJSON [] [] TResult (toTDef checkedFSM))
75+
printLn (TermWrite.serialiseJSON [] [] TResult (toTDef checkedFSM))
7676

7777

src/PetriFormat.idr

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
module PetriFormat
3+
4+
import Typedefs.Typedefs
5+
import Typedefs.Names
6+
import Data.Vect
7+
import PetriGraph
8+
9+
TNat : TDefR 2
10+
TNat = RRef 0
11+
12+
TEdges : TDefR 2
13+
TEdges = RRef 1
14+
15+
16+
TPetriSpec : TDefR 2
17+
TPetriSpec = TProd [TNat, TEdges]
18+
19+
convertSpec : Ty [Nat, List (List Nat, List Nat)] TPetriSpec -> Maybe (n ** PetriSpec n)
20+
convertSpec (places, edges) =
21+
MkDPair (length edges) . MkPetriSpec places <$> convertList places (fromList edges)
22+
where
23+
convertList : (p : Nat) -> (Vect n (List Nat, List Nat))
24+
-> Maybe (Vect n (List (Fin p), List (Fin p)))
25+
convertList p = traverse (\(a, b) => [| MkPair (traverse (\v => natToFin v p) a)
26+
(traverse (\v => natToFin v p) b) |])
27+
28+
TTree : TDefR 1
29+
TTree = TMu
30+
[ ("Tensor", TProd [TVar 0, TVar 0])
31+
, ("Sequence", TProd [TVar 0, TVar 0])
32+
, ("Sym", TProd [TVar 1, TVar 1])
33+
, ("Id", TVar 1)
34+
, ("Mor", TVar 1)
35+
]
36+
37+
convertTree : Ty [Nat] TTree -> (Tree Nat Nat)
38+
convertTree (Inn (Left (a, b))) = Tensor (convertTree a) (convertTree b)
39+
convertTree (Inn (Right (Left (a, b)))) = Sequence (convertTree a) (convertTree b)
40+
convertTree (Inn (Right (Right (Left (a, b))))) = Sym a b
41+
convertTree (Inn (Right (Right (Right (Left i))))) = Id i
42+
convertTree (Inn (Right (Right (Right (Right m))))) = Mor m
43+

src/PetriGraph.idr

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,13 @@ PetriPath = TMu [ ("Tensor", TProd [TVar 0, TVar 0])
4848
4949
-}
5050

51+
public export
5152
record PetriSpec (k : Nat) where
5253
constructor MkPetriSpec
5354
Places : Nat
5455
Edges : Vect k (List (Fin Places), List (Fin Places))
5556

56-
PetriState : Type
57-
PetriState = List Nat
58-
57+
public export
5958
data Tree o m = Tensor (Tree o m) (Tree o m)
6059
| Sequence (Tree o m) (Tree o m)
6160
| Sym o o
@@ -81,6 +80,14 @@ Codomain m (Mor i) = snd $ index i m
8180
PetriPath : Nat -> Nat -> Type
8281
PetriPath places k = Tree (Fin places) (Fin k)
8382

83+
checkTree : (spec : PetriSpec k) -> Tree Nat Nat -> Maybe (PetriPath (Places spec) k)
84+
checkTree spec (Tensor x y) = [| Tensor (checkTree spec x) (checkTree spec y) |]
85+
checkTree spec (Sequence x y) = [| Sequence (checkTree spec x) (checkTree spec y) |]
86+
checkTree spec (Sym x y) = [| Sym (natToFin x (Places spec)) (natToFin y (Places spec)) |]
87+
checkTree spec (Id x) = Id <$> natToFin x (Places spec)
88+
checkTree spec (Mor x) {k} = Mor <$> natToFin x k
89+
90+
8491
goodPetriSMC : (spec : PetriSpec k) -> StrictMonoidalCategory
8592
goodPetriSMC spec = goodHypergraphSMC (Fin k)
8693
(\m => fst $ index m (Edges spec))
@@ -115,3 +122,15 @@ goodMapping s (Sequence x y) {k} = do
115122
goodMapping s (Id x) = Just $ identity (cat (goodPetriSMC s)) [x]
116123
goodMapping s (Sym a b) = Just $ goodPermutation (swap [a] [b])
117124
goodMapping s (Mor x) = Just $ goodSingleton x
125+
126+
PetriState : PetriSpec k -> Type
127+
PetriState spec = List (Fin (Places spec))
128+
129+
composeWithId : (spec : PetriSpec k) -> (path : PetriPath (Places spec) k)
130+
-> (state : PetriState spec)
131+
-> Maybe (mor (cat (goodPetriSMC spec))
132+
(state)
133+
(Codomain (Edges spec) path))
134+
composeWithId spec path state with (decEq state (Domain (Edges spec) path))
135+
composeWithId spec path state | Yes prf = rewrite prf in goodMapping spec path
136+
composeWithId spec path state | No _ = Nothing

0 commit comments

Comments
 (0)