Skip to content

Commit e092559

Browse files
committed
add type definitions for petrinets
1 parent a7ed660 commit e092559

File tree

4 files changed

+82
-44
lines changed

4 files changed

+82
-44
lines changed

src/JSONFormat.idr

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ import TGraph
3131

3232
import Typedefs.Typedefs
3333

34+
public export
35+
ParseError : Type -> Type
36+
ParseError = Either String
37+
38+
public export
39+
JSONParser : Type -> Type
40+
JSONParser t = JSON -> ParseError t
41+
3442
listPairToJSON : List (Nat, Nat) -> JSON
3543
listPairToJSON xs = JArray $ map
3644
(\(a, b) => JObject [("input", JNumber $ cast a), ("output", JNumber $ cast b)]) xs
@@ -41,7 +49,7 @@ expectNat (JNumber n) = if n < 0 then Left "Expected Nat"
4149
else pure $ Prelude.toNat {a=Int} $ cast n
4250
expectNat _ = Left "Expected Nat"
4351

44-
expectEdges : JSON -> Either String (Nat, Nat)
52+
expectEdges : JSONParser (Nat, Nat)
4553
expectEdges (JObject [("input", a),("output", b)])= [| MkPair (expectNat a) (expectNat b) |]
4654
expectEdges _ = Left "expected list of edges"
4755

@@ -54,9 +62,17 @@ expectListNat : JSON -> Either String (List Nat)
5462
expectListNat js = expectList js >>= traverse expectNat
5563

5664
export
57-
expectListEdges : JSON -> Either String (List (Nat, Nat))
65+
expectListEdges : JSONParser (List (Nat, Nat))
5866
expectListEdges js = expectList js >>= traverse expectEdges
5967

68+
expectPair : (JSONParser a) -> (JSONParser b) -> JSONParser (a, b)
69+
expectPair pa pb (JObject [("_0", a), ("_1", b)]) = [| MkPair (pa a) (pb b) |]
70+
expectPair pa pb _ = Left "Expected Pair"
71+
72+
export
73+
expectListListEdges : JSON -> Either String (List (List Nat, List Nat))
74+
expectListListEdges js = expectList js >>= traverse (expectPair expectListNat expectListNat)
75+
6076
public export
6177
TResult : TDefR 0
6278
TResult = TSum [T1, TFSMErr]

src/Main.idr

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ import Typedefs.TermParse
3636
import Typedefs.TermWrite
3737

3838
import TGraph
39+
import PetriGraph
40+
import PetriFormat
3941
import GraphCat
4042

4143
-- base
@@ -59,6 +61,19 @@ checkFSM fileContent = do
5961
let v = lastStep cat a b m
6062
pure ()
6163

64+
checkPetri : String -> FSMCheck ()
65+
checkPetri fileContent = do
66+
content <- maybe (Left JSONError) Right (parse fileContent)
67+
petri <- either (const $ Left InvalidFSM) Right (Typedefs.TermParse.deserialiseJSON TPetriExec
68+
[ (Nat ** expectNat)
69+
, (List (List Nat, List Nat) ** expectListListEdges)
70+
, (List Nat ** expectListNat)
71+
]
72+
content)
73+
let True = isJust $ composeWithId (Spec petri) (Path petri) (State Petri)
74+
| Left InvalidFSM
75+
pure ()
76+
6277

6378
toTDef : FSMCheck () -> Ty [] TResult
6479
toTDef (Left err) = Right (toTDefErr err)
@@ -74,4 +89,14 @@ main = do
7489
let checkedFSM = asFSMCheck >>= checkFSM
7590
printLn (TermWrite.serialiseJSON [] [] TResult (toTDef checkedFSM))
7691

92+
-- partial
93+
-- main : IO ()
94+
-- main = do
95+
-- [_,filename] <- getArgs
96+
-- | _ => putStrLn "Usage: fsm-oracle FILE"
97+
-- content <- (readFile filename)
98+
-- let asFSMCheck = either (const (Left FSError)) Right content
99+
-- let checkedFSM = asFSMCheck >>= checkFSM
100+
-- printLn (TermWrite.serialiseJSON [] [] TResult (toTDef checkedFSM))
101+
--
77102

src/PetriFormat.idr

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ TNat = RRef 0
1212
TEdges : TDefR 2
1313
TEdges = RRef 1
1414

15+
TState : TDefR 3
16+
TState = RRef 2
1517

1618
TPetriSpec : TDefR 2
1719
TPetriSpec = TProd [TNat, TEdges]
@@ -41,3 +43,19 @@ convertTree (Inn (Right (Right (Left (a, b))))) = Sym a b
4143
convertTree (Inn (Right (Right (Right (Left i))))) = Id i
4244
convertTree (Inn (Right (Right (Right (Right m))))) = Mor m
4345

46+
convertState : (spec : PetriSpec k) -> List Nat -> Maybe (PetriState spec)
47+
convertState spec = traverse (\s => natToFin s (Places spec))
48+
49+
public export
50+
TPetriExec : TDefR 3
51+
TPetriExec = TProd [TProd [RRef 0 , RRef 1], RRef 2, weakenTDef TTree 3 (LTESucc LTEZero)]
52+
53+
dropContext : Ty [Nat, a, b] (weakenTDef TTree 3 (LTESucc LTEZero)) -> Ty [Nat] TTree
54+
55+
export
56+
convertExec : Ty [Nat, List (List Nat, List Nat), List Nat] TPetriExec -> Maybe PetriExec
57+
convertExec ((a, b), c, d) = do (k ** spec) <- convertSpec (a , b)
58+
path <- checkTree spec (convertTree $ dropContext d)
59+
state <- convertState spec c
60+
pure $ MkPetriExec spec path state
61+

src/PetriGraph.idr

Lines changed: 21 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -13,40 +13,6 @@ import MonoidalCategory.StrictMonoidalCategory
1313

1414

1515
%default total
16-
{-
17-
StringDiag := {
18-
tensor := {
19-
tensor := {
20-
f
21-
g
22-
}
23-
sequence := {
24-
h
25-
identity A
26-
}
27-
}
28-
}
29-
}
30-
31-
data Tree o m = Tensor Tree Tree | Sequence Tree Tree | Id o | Mor m
32-
-}
33-
-- PetriSpec
34-
-- Vertex: Nat, Edges : List ((List Nat), (List Nat))
35-
{-
36-
PetriVertex : TDefR 0
37-
PetriVertex = TProd [TList Nat, TList (TList Nat, TList Nat)]
38-
39-
PetriState : TDefR 0
40-
PetriState = TList `ap` TNat
41-
42-
PetriPath : TDefR 2
43-
PetriPath = TMu [ ("Tensor", TProd [TVar 0, TVar 0])
44-
, ("Sequence", TProd [TVar 0, TVar 0])
45-
, ("Id", TVar 1)
46-
, ("Mor", TVar 2)
47-
]
48-
49-
-}
5016

5117
public export
5218
record PetriSpec (k : Nat) where
@@ -61,25 +27,39 @@ data Tree o m = Tensor (Tree o m) (Tree o m)
6127
| Id o
6228
| Mor m
6329

30+
public export
31+
PetriState : PetriSpec k -> Type
32+
PetriState spec = List (Fin (Places spec))
33+
34+
public export
35+
PetriPath : Nat -> Nat -> Type
36+
PetriPath places k = Tree (Fin places) (Fin k)
37+
38+
public export
39+
record PetriExec where
40+
constructor MkPetriExec
41+
Spec : PetriSpec k
42+
Path : PetriPath (Places Spec) k
43+
State : PetriState Spec
44+
45+
46+
public export
6447
Domain : (morphisms : Vect k (List a, List a)) -> Tree a (Fin k) -> List a
6548
Domain m (Tensor l r) = (Domain m l) ++ (Domain m r)
6649
Domain m (Sequence l r) = Domain m l
6750
Domain m (Id o) = pure o
6851
Domain m (Sym l r) = [l, r]
6952
Domain m (Mor i) = fst $ index i m
7053

71-
54+
public export
7255
Codomain : (morphisms : Vect k (List a, List a)) -> Tree a (Fin k) -> List a
7356
Codomain m (Tensor l r) = Codomain m l ++ Codomain m r
7457
Codomain m (Sequence l r) = Codomain m r
7558
Codomain m (Id o) = pure o
7659
Codomain m (Sym l r) = [r, l]
7760
Codomain m (Mor i) = snd $ index i m
7861

79-
80-
PetriPath : Nat -> Nat -> Type
81-
PetriPath places k = Tree (Fin places) (Fin k)
82-
62+
export
8363
checkTree : (spec : PetriSpec k) -> Tree Nat Nat -> Maybe (PetriPath (Places spec) k)
8464
checkTree spec (Tensor x y) = [| Tensor (checkTree spec x) (checkTree spec y) |]
8565
checkTree spec (Sequence x y) = [| Sequence (checkTree spec x) (checkTree spec y) |]
@@ -88,6 +68,7 @@ checkTree spec (Id x) = Id <$> natToFin x (Places spec)
8868
checkTree spec (Mor x) {k} = Mor <$> natToFin x k
8969

9070

71+
public export
9172
goodPetriSMC : (spec : PetriSpec k) -> StrictMonoidalCategory
9273
goodPetriSMC spec = goodHypergraphSMC (Fin k)
9374
(\m => fst $ index m (Edges spec))
@@ -123,9 +104,7 @@ goodMapping s (Id x) = Just $ identity (cat (goodPetriSMC s)) [x]
123104
goodMapping s (Sym a b) = Just $ goodPermutation (swap [a] [b])
124105
goodMapping s (Mor x) = Just $ goodSingleton x
125106
126-
PetriState : PetriSpec k -> Type
127-
PetriState spec = List (Fin (Places spec))
128-
107+
export
129108
composeWithId : (spec : PetriSpec k) -> (path : PetriPath (Places spec) k)
130109
-> (state : PetriState spec)
131110
-> Maybe (mor (cat (goodPetriSMC spec))

0 commit comments

Comments
 (0)