Created
July 15, 2021 11:53
-
-
Save rzrn/99d4a002735a3baad59735fee661c562 to your computer and use it in GitHub Desktop.
Path algebra
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type path = | |
| Var of string | |
| Ref | |
| Trans of path * path | |
| Rev of path | |
let rec show : path -> string = function | |
| Var x -> x | |
| Ref -> "ref" | |
| Trans (p, q) -> Printf.sprintf "(%s * %s)" (show p) (show q) | |
| Rev p -> show p ^ "⁻¹" | |
let rec eval : path -> path = function | |
| Trans (p, q) -> trans (eval p, eval q) | |
| Rev p -> rev (eval p) | |
| v -> v | |
and trans : path * path -> path = function | |
| Trans (p, q), r -> trans (p, trans (q, r)) | |
| Ref, p | p, Ref -> p | |
| Rev p, Trans (q, r) -> if p = q then r else Trans (Rev p, Trans (q, r)) | |
| p, Trans (Rev q, r) -> if p = q then r else Trans (p, Trans (Rev q, r)) | |
| Rev p, q -> if p = q then Ref else Trans (Rev p, q) | |
| p, Rev q -> if p = q then Ref else Trans (p, Rev q) | |
| p, q -> Trans (p, q) | |
and rev : path -> path = function | |
| Rev p -> p | |
| Ref -> Ref | |
| Trans (p, q) -> trans (rev q, rev p) | |
| v -> Rev v | |
let expr = Trans (Trans (Var "r", Var "p"), Trans (Rev (Trans (Var "p", Ref)), Rev (Trans (Var "q", Rev (Trans (Var "p", Var "q")))))) | |
let () = Printf.printf "%s ~> %s\n" (show expr) (show (eval expr)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment