src/Tools/Haskell/Term_XML/Encode.hs
author wenzelm
Sat, 10 Nov 2018 17:12:09 +0100
changeset 69280 e1d01b351724
parent 69240 16ca270090b6
permissions -rw-r--r--
more formal references;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     1
{- generated by Isabelle -}
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     2
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     3
{-  Title:      Tools/Haskell/Term_XML/Encode.hs
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     4
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     5
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     6
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     7
XML data representation of lambda terms.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69240
diff changeset
     8
e1d01b351724 more formal references;
wenzelm
parents: 69240
diff changeset
     9
See also "$ISABELLE_HOME/src/Pure/term_xml.ML".
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    10
-}
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    11
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    12
{-# LANGUAGE LambdaCase #-}
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    13
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    14
module Isabelle.Term_XML.Encode (sort, typ, term)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    15
where
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    16
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    17
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    18
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    19
import Isabelle.XML.Encode
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    20
import Isabelle.Term
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    21
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    22
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    23
sort :: T Sort
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    24
sort = list string
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    25
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    26
typ :: T Typ
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    27
typ ty =
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    28
  ty |> variant
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    29
   [\case { Type (a, b) -> Just ([a], list typ b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    30
    \case { TFree (a, b) -> Just ([a], sort b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    31
    \case { TVar ((a, b), c) -> Just ([a, int_atom b], sort c); _ -> Nothing }]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    32
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    33
term :: T Term
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    34
term t =
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    35
  t |> variant
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    36
   [\case { Const (a, b) -> Just ([a], typ b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    37
    \case { Free (a, b) -> Just ([a], typ b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    38
    \case { Var ((a, b), c) -> Just ([a, int_atom b], typ c); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    39
    \case { Bound a -> Just ([int_atom a], []); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    40
    \case { Abs (a, b, c) -> Just ([a], pair typ term (b, c)); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    41
    \case { App a -> Just ([], pair term term a); _ -> Nothing }]