packages feed

funcons-tools-0.2.0.15: cbs/Funcons/Core/Computations/Threads/Multithreading/Multithreading.hs

-- GeNeRaTeD fOr: /home/thomas/repos/plancomps/CBS-beta/Unstable-Funcons-beta/Computations/Threads/Multithreading/Multithreading.cbs
{-# LANGUAGE OverloadedStrings #-}

module Funcons.Core.Computations.Threads.Multithreading.Multithreading where

import Funcons.EDSL

import Funcons.Operations hiding (Values,libFromList)
entities = []

types = typeEnvFromList
    [("thread-ids",DataTypeMemberss "thread-ids" [] [DataTypeMemberConstructor "thread-id" [TName "atoms"] (Just [])]),("threads",DataTypeMemberss "threads" [] [DataTypeMemberConstructor "thread" [TApp "thunks" [TName "values"],TSortSeq (TApp "lists" [TName "thread-ids"]) QuestionMarkOp] (Just [])]),("thread-preemtibilities",DataTypeMemberss "thread-preemtibilities" [] [DataTypeMemberConstructor "thread-preemptible" [] (Just []),DataTypeMemberConstructor "thread-cooperative" [] (Just [])])]

funcons = libFromList
    [("thread-id",StrictFuncon stepThread_id),("thread",StrictFuncon stepThread),("thread-joinable",StrictFuncon stepThread_joinable),("thread-detached",StrictFuncon stepThread_detached),("is-some-thread-active",NullaryFuncon stepIs_some_thread_active),("is-some-thread-suspended",NullaryFuncon stepIs_some_thread_suspended),("initialise-multithreading",NullaryFuncon stepInitialise_multithreading),("initialise-thread-map",NullaryFuncon stepInitialise_thread_map),("initialise-active-thread-set",NullaryFuncon stepInitialise_active_thread_set),("initialise-thread-stepping",NullaryFuncon stepInitialise_thread_stepping),("initialise-terminated-thread-map",NullaryFuncon stepInitialise_terminated_thread_map),("initialise-thread-schedule",NullaryFuncon stepInitialise_thread_schedule),("multithread",NonStrictFuncon stepMultithread),("thread-activate",StrictFuncon stepThread_activate),("thread-detach",StrictFuncon stepThread_detach),("current-thread",NullaryFuncon stepCurrent_thread),("thread-step",NullaryFuncon stepThread_step),("thread-atomic",NonStrictFuncon stepThread_atomic),("thread-yield",StrictFuncon stepThread_yield),("thread-spin",NonStrictFuncon stepThread_spin),("thread-suspend",StrictFuncon stepThread_suspend),("thread-resume",StrictFuncon stepThread_resume),("thread-terminate",StrictFuncon stepThread_terminate),("is-thread-terminated",StrictFuncon stepIs_thread_terminated),("thread-value",StrictFuncon stepThread_value),("thread-join",StrictFuncon stepThread_join),("thread-exterminate",StrictFuncon stepThread_exterminate),("update-thread-stepping",NullaryFuncon stepUpdate_thread_stepping),("update-thread-schedule",StrictFuncon stepUpdate_thread_schedule),("current-thread-schedule",NullaryFuncon stepCurrent_thread_schedule),("thread-preemptible",NullaryFuncon stepThread_preemptible),("thread-cooperative",NullaryFuncon stepThread_cooperative),("is-thread-preemptible",StrictFuncon stepIs_thread_preemptible),("thread-ids",NullaryFuncon stepThread_ids),("threads",NullaryFuncon stepThreads),("thread-preemtibilities",NullaryFuncon stepThread_preemtibilities)]

thread_id_ fargs = FApp "thread-id" (fargs)
stepThread_id fargs =
    evalRules [rewrite1] []
    where rewrite1 = do
            let env = emptyEnv
            env <- vsMatch fargs [VPMetaVar "_X1"] env
            env <- sideCondition (SCIsInSort (TVar "_X1") (TSortSeq (TName "values") QuestionMarkOp)) env
            rewriteTermTo (TApp "datatype-value" [TFuncon (FValue (ADTVal "list" [FValue (ADTVal "unicode-character" [FValue (Int 116)]),FValue (ADTVal "unicode-character" [FValue (Int 104)]),FValue (ADTVal "unicode-character" [FValue (Int 114)]),FValue (ADTVal "unicode-character" [FValue (Int 101)]),FValue (ADTVal "unicode-character" [FValue (Int 97)]),FValue (ADTVal "unicode-character" [FValue (Int 100)]),FValue (ADTVal "unicode-character" [FValue (Int 45)]),FValue (ADTVal "unicode-character" [FValue (Int 105)]),FValue (ADTVal "unicode-character" [FValue (Int 100)])])),TVar "_X1"]) env

thread_ fargs = FApp "thread" (fargs)
stepThread fargs =
    evalRules [rewrite1] []
    where rewrite1 = do
            let env = emptyEnv
            env <- vsMatch fargs [VPMetaVar "_X1",VPSeqVar "_X2?" QuestionMarkOp] env
            env <- sideCondition (SCIsInSort (TVar "_X1") (TSortSeq (TName "values") QuestionMarkOp)) env
            env <- sideCondition (SCIsInSort (TVar "_X2?") (TSortSeq (TSortSeq (TName "values") QuestionMarkOp) QuestionMarkOp)) env
            rewriteTermTo (TApp "datatype-value" [TFuncon (FValue (ADTVal "list" [FValue (ADTVal "unicode-character" [FValue (Int 116)]),FValue (ADTVal "unicode-character" [FValue (Int 104)]),FValue (ADTVal "unicode-character" [FValue (Int 114)]),FValue (ADTVal "unicode-character" [FValue (Int 101)]),FValue (ADTVal "unicode-character" [FValue (Int 97)]),FValue (ADTVal "unicode-character" [FValue (Int 100)])])),TVar "_X1",TVar "_X2?"]) env

thread_joinable_ fargs = FApp "thread-joinable" (fargs)
stepThread_joinable fargs =
    evalRules [rewrite1] []
    where rewrite1 = do
            let env = emptyEnv
            env <- vsMatch fargs [VPAnnotated (VPMetaVar "TH") (TApp "thunks" [TName "values"])] env
            rewriteTermTo (TApp "thread" [TVar "TH",TApp "list" []]) env

thread_detached_ fargs = FApp "thread-detached" (fargs)
stepThread_detached fargs =
    evalRules [rewrite1] []
    where rewrite1 = do
            let env = emptyEnv
            env <- vsMatch fargs [VPAnnotated (VPMetaVar "TH") (TApp "thunks" [TName "values"])] env
            rewriteTermTo (TApp "thread" [TVar "TH"]) env

is_some_thread_active_ = FName "is-some-thread-active"
stepIs_some_thread_active = evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            stepTermTo (TApp "not" [TApp "is-equal" [TVar "ATS",TSet []]]) env

is_some_thread_suspended_ = FName "is-some-thread-suspended"
stepIs_some_thread_suspended = evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM"] env
            stepTermTo (TApp "not" [TApp "is-equal" [TVar "ATS",TApp "dom" [TVar "TM"]]]) env

initialise_multithreading_ = FName "initialise-multithreading"
stepInitialise_multithreading = evalRules [rewrite1] []
    where rewrite1 = do
            let env = emptyEnv
            rewriteTermTo (TApp "sequential" [TName "initialise-thread-map",TName "initialise-active-thread-set",TName "initialise-thread-stepping",TName "initialise-terminated-thread-map",TName "initialise-thread-schedule"]) env

initialise_thread_map_ = FName "initialise-thread-map"
stepInitialise_thread_map = evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            putMutTerm "thread-map" (TApp "map" []) env
            stepTermTo (TName "null-value") env

initialise_active_thread_set_ = FName "initialise-active-thread-set"
stepInitialise_active_thread_set = evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            putMutTerm "active-thread-set" (TSet []) env
            stepTermTo (TName "null-value") env

initialise_thread_stepping_ = FName "initialise-thread-stepping"
stepInitialise_thread_stepping = evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            putMutTerm "thread-stepping" (TSeq []) env
            stepTermTo (TName "null-value") env

initialise_terminated_thread_map_ = FName "initialise-terminated-thread-map"
stepInitialise_terminated_thread_map = evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            putMutTerm "terminated-thread-map" (TApp "map" []) env
            stepTermTo (TName "null-value") env

initialise_thread_schedule_ = FName "initialise-thread-schedule"
stepInitialise_thread_schedule = evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            putMutTerm "thread-schedule" (TSet []) env
            stepTermTo (TName "null-value") env

multithread_ fargs = FApp "multithread" (fargs)
stepMultithread fargs =
    evalRules [rewrite1] []
    where rewrite1 = do
            let env = emptyEnv
            env <- fsMatch fargs [PMetaVar "X"] env
            rewriteTermTo (TApp "sequential" [TName "initialise-multithreading",TApp "give" [TApp "thread-activate" [TApp "thread-joinable" [TApp "thunk" [TApp "closure" [TVar "X"]]]],TApp "handle-abrupt" [TApp "sequential" [TApp "while-true" [TName "is-some-thread-active",TApp "sequential" [TName "update-thread-stepping",TName "thread-step"]],TApp "check" [TApp "not" [TName "is-some-thread-suspended"]],TApp "thread-value" [TName "given"]],TName "given"]]]) env

thread_activate_ fargs = FApp "thread-activate" (fargs)
stepThread_activate fargs =
    evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "THR") (TName "threads")] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- premise (TApp "thread-id" [TName "fresh-atom"]) [PMetaVar "TI"] env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-unite" [TMap [TBinding (TVar "TI") (TVar "THR")],TVar "TM"]) [VPMetaVar "TM'"]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "set-unite" [TSet [TVar "TI"],TVar "ATS"]) [VPMetaVar "ATS'"]) env
            putMutTerm "thread-map" (TVar "TM'") env
            putMutTerm "active-thread-set" (TVar "ATS'") env
            stepTermTo (TVar "TI") env

thread_detach_ fargs = FApp "thread-detach" (fargs)
stepThread_detach fargs =
    evalRules [] [step1,step2]
    where step1 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI") (TName "thread-ids")] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM"] env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-lookup" [TVar "TM",TVar "TI"]) [PADT "thread" [VPMetaVar "TH",VPWildCard]]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-override" [TMap [TBinding (TVar "TI") (TApp "thread" [TVar "TH"])],TVar "TM"]) [VPMetaVar "TM'"]) env
            putMutTerm "thread-map" (TVar "TM'") env
            stepTermTo (TName "null-value") env
          step2 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI") (TName "thread-ids")] env
            env <- getMutPatt "terminated-thread-map" [VPMetaVar "TMV"] env
            env <- lifted_sideCondition (SCEquality (TApp "is-in-set" [TVar "TI",TApp "dom" [TVar "TMV"]]) (TName "true")) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-delete" [TVar "TMV",TSet [TVar "TI"]]) [VPMetaVar "TMV'"]) env
            putMutTerm "terminated-thread-map" (TVar "TMV'") env
            stepTermTo (TName "null-value") env

current_thread_ = FName "current-thread"
stepCurrent_thread = evalRules [] [step1,step2]
    where step1 = do
            let env = emptyEnv
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            stepTermTo (TVar "TI") env
          step2 = do
            let env = emptyEnv
            env <- getMutPatt "thread-stepping" [] env
            stepTermTo (TName "fail") env

thread_step_ = FName "thread-step"
stepThread_step = evalRules [] [step1,step2,step3]
    where step1 = do
            let env = emptyEnv
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM"] env
            env <- lifted_sideCondition (SCPatternMatch (TApp "lookup" [TVar "TM",TVar "TI"]) [PADT "thread" [PADT "thunk" [PADT "abstraction" [VPMetaVar "X"]],VPSeqVar "L?" QuestionMarkOp]]) env
            putMutTerm "thread-stepping" (TVar "TI") env
            putMutTerm "thread-map" (TVar "TM") env
            env <- premise (TVar "X") [PMetaVar "X'"] env
            env <- getMutPatt "thread-stepping" [VPSeqVar "TI?" QuestionMarkOp] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM'"] env
            env <- lifted_sideCondition (SCPatternMatch (TApp "if-true-else" [TApp "is-in-set" [TVar "TI",TApp "dom" [TVar "TM'"]],TApp "map-override" [TMap [TBinding (TVar "TI") (TApp "thread" [TApp "thunk" [TApp "abstraction" [TVar "X'"]],TVar "L?"])],TVar "TM'"],TVar "TM'"]) [VPMetaVar "TM''"]) env
            putMutTerm "thread-stepping" (TVar "TI?") env
            putMutTerm "thread-map" (TVar "TM''") env
            stepTermTo (TName "null-value") env
          step2 = do
            let env = emptyEnv
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM"] env
            env <- lifted_sideCondition (SCPatternMatch (TApp "lookup" [TVar "TM",TVar "TI"]) [PADT "thread" [PADT "thunk" [PADT "abstraction" [VPMetaVar "X"]]]]) env
            env <- lifted_sideCondition (SCPatternMatch (TVar "X") [VPAnnotated (VPMetaVar "V") (TName "values")]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-delete" [TVar "TM",TSet [TVar "TI"]]) [VPMetaVar "TM'"]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "set-difference" [TVar "ATS",TSet [TVar "TI"]]) [VPMetaVar "ATS'"]) env
            putMutTerm "active-thread-set" (TVar "ATS'") env
            putMutTerm "thread-stepping" (TSeq []) env
            putMutTerm "thread-map" (TVar "TM'") env
            stepTermTo (TName "null-value") env
          step3 = do
            let env = emptyEnv
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM"] env
            env <- getMutPatt "terminated-thread-map" [VPMetaVar "TVM"] env
            env <- lifted_sideCondition (SCPatternMatch (TApp "lookup" [TVar "TM",TVar "TI"]) [PADT "thread" [PADT "thunk" [PADT "abstraction" [VPMetaVar "X"]],PADT "datatype-value" [VPLit (ADTVal "list" [FValue (ADTVal "unicode-character" [FValue (Int 108)]),FValue (ADTVal "unicode-character" [FValue (Int 105)]),FValue (ADTVal "unicode-character" [FValue (Int 115)]),FValue (ADTVal "unicode-character" [FValue (Int 116)])]),VPSeqVar "TI*" StarOp]]]) env
            env <- lifted_sideCondition (SCPatternMatch (TVar "X") [VPAnnotated (VPMetaVar "V") (TName "values")]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-delete" [TVar "TM",TSet [TVar "TI"]]) [VPMetaVar "TM'"]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "set-unite" [TApp "set-difference" [TVar "ATS",TSet [TVar "TI"]],TSet [TVar "TI*"]]) [VPMetaVar "ATS'"]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-unite" [TVar "TVM",TMap [TBinding (TVar "TI") (TVar "V")]]) [VPMetaVar "TVM'"]) env
            putMutTerm "active-thread-set" (TVar "ATS'") env
            putMutTerm "thread-stepping" (TSeq []) env
            putMutTerm "thread-map" (TVar "TM'") env
            putMutTerm "terminated-thread-map" (TVar "TVM'") env
            stepTermTo (TName "null-value") env

thread_atomic_ fargs = FApp "thread-atomic" (fargs)
stepThread_atomic fargs =
    evalRules [] [step1,step2,step3,step4,step5,step6]
    where step1 = do
            let env = emptyEnv
            env <- lifted_fsMatch fargs [PMetaVar "X"] env
            env <- getMutPatt "store" [VPMetaVar "Sigma"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getControlPatt "abrupted" (Nothing) env
            putMutTerm "store" (TVar "Sigma") env
            putMutTerm "active-thread-set" (TVar "ATS") env
            putMutTerm "thread-stepping" (TVar "TI") env
            (env,[__varabrupted]) <- receiveSignals ["abrupted"] (withControlTerm "abrupted" (Nothing) env (premise (TVar "X") [PMetaVar "X'"] env))
            env <- receiveSignalPatt __varabrupted (Nothing) env
            env <- getMutPatt "store" [VPMetaVar "Sigma'"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS'"] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI'"] env
            putMutTerm "store" (TVar "Sigma'") env
            putMutTerm "active-thread-set" (TVar "ATS'") env
            putMutTerm "thread-stepping" (TVar "TI'") env
            (env,[__varabrupted]) <- receiveSignals ["abrupted"] (withControlTerm "abrupted" (Nothing) env (premise (TApp "thread-atomic" [TVar "X'"]) [PMetaVar "V"] env))
            env <- receiveSignalPatt __varabrupted (Nothing) env
            env <- getMutPatt "store" [VPMetaVar "Sigma''"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS''"] env
            env <- getMutPatt "thread-stepping" [VPSeqVar "TI''?" QuestionMarkOp] env
            putMutTerm "store" (TVar "Sigma''") env
            putMutTerm "active-thread-set" (TVar "ATS''") env
            putMutTerm "thread-stepping" (TVar "TI''?") env
            stepTermTo (TVar "V") env
          step2 = do
            let env = emptyEnv
            env <- lifted_fsMatch fargs [PMetaVar "X"] env
            env <- getMutPatt "store" [VPMetaVar "Sigma"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getControlPatt "abrupted" (Just (VPMetaVar "A")) env
            putMutTerm "store" (TVar "Sigma") env
            putMutTerm "active-thread-set" (TVar "ATS") env
            putMutTerm "thread-stepping" (TVar "TI") env
            (env,[__varabrupted]) <- receiveSignals ["abrupted"] (withControlTerm "abrupted" (Nothing) env (premise (TVar "X") [PMetaVar "X'"] env))
            env <- receiveSignalPatt __varabrupted (Nothing) env
            env <- getMutPatt "store" [VPMetaVar "Sigma'"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS'"] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI'"] env
            putMutTerm "store" (TVar "Sigma'") env
            putMutTerm "active-thread-set" (TVar "ATS'") env
            putMutTerm "thread-stepping" (TVar "TI'") env
            (env,[__varabrupted]) <- receiveSignals ["abrupted"] (withControlTerm "abrupted" (Just (TVar "A")) env (premise (TApp "thread-atomic" [TVar "X'"]) [PMetaVar "V"] env))
            env <- receiveSignalPatt __varabrupted (Just (VPMetaVar "A")) env
            env <- getMutPatt "store" [VPMetaVar "Sigma''"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS''"] env
            env <- getMutPatt "thread-stepping" [VPSeqVar "TI''?" QuestionMarkOp] env
            raiseTerm "abrupted" (TVar "A") env
            putMutTerm "store" (TVar "Sigma''") env
            putMutTerm "active-thread-set" (TVar "ATS''") env
            putMutTerm "thread-stepping" (TVar "TI''?") env
            stepTermTo (TVar "V") env
          step3 = do
            let env = emptyEnv
            env <- lifted_fsMatch fargs [PMetaVar "X"] env
            env <- getControlPatt "abrupted" (Just (VPMetaVar "A")) env
            (env,[__varabrupted]) <- receiveSignals ["abrupted"] (withControlTerm "abrupted" (Just (TVar "A")) env (premise (TVar "X") [PMetaVar "X'"] env))
            env <- receiveSignalPatt __varabrupted (Just (VPMetaVar "A")) env
            raiseTerm "abrupted" (TVar "A") env
            stepTermTo (TApp "thread-atomic" [TVar "X'"]) env
          step4 = do
            let env = emptyEnv
            env <- lifted_fsMatch fargs [PMetaVar "X"] env
            env <- getControlPatt "abrupted" (Nothing) env
            (env,[__varabrupted]) <- receiveSignals ["abrupted"] (withControlTerm "abrupted" (Nothing) env (premise (TVar "X") [PAnnotated (PMetaVar "V") (TName "values")] env))
            env <- receiveSignalPatt __varabrupted (Nothing) env
            stepTermTo (TVar "V") env
          step5 = do
            let env = emptyEnv
            env <- lifted_fsMatch fargs [PMetaVar "X"] env
            env <- getControlPatt "abrupted" (Just (VPMetaVar "A")) env
            (env,[__varabrupted]) <- receiveSignals ["abrupted"] (withControlTerm "abrupted" (Just (TVar "A")) env (premise (TVar "X") [PAnnotated (PMetaVar "V") (TName "values")] env))
            env <- receiveSignalPatt __varabrupted (Just (VPMetaVar "A")) env
            raiseTerm "abrupted" (TVar "A") env
            stepTermTo (TApp "thread-atomic" [TVar "V"]) env
          step6 = do
            let env = emptyEnv
            env <- lifted_fsMatch fargs [PAnnotated (PMetaVar "V") (TName "values")] env
            stepTermTo (TVar "V") env

thread_yield_ fargs = FApp "thread-yield" (fargs)
stepThread_yield fargs =
    evalRules [] [step1,step2,step3]
    where step1 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [] env
            putMutTerm "thread-stepping" (TSeq []) env
            stepTermTo (TName "null-value") env
          step2 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI") (TName "thread-ids")] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- lifted_sideCondition (SCEquality (TApp "is-in-set" [TVar "TI",TVar "ATS"]) (TName "true")) env
            putMutTerm "thread-stepping" (TVar "TI") env
            stepTermTo (TName "null-value") env
          step3 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI") (TName "thread-ids")] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- lifted_sideCondition (SCEquality (TApp "is-in-set" [TVar "TI",TVar "ATS"]) (TName "false")) env
            stepTermTo (TName "fail") env

thread_spin_ fargs = FApp "thread-spin" (fargs)
stepThread_spin fargs =
    evalRules [rewrite1] []
    where rewrite1 = do
            let env = emptyEnv
            env <- fsMatch fargs [PMetaVar "X"] env
            rewriteTermTo (TApp "else" [TVar "X",TApp "sequential" [TApp "thread-yield" [],TApp "thread-spin" [TVar "X"]]]) env

thread_suspend_ fargs = FApp "thread-suspend" (fargs)
stepThread_suspend fargs =
    evalRules [] [step1,step2]
    where step1 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPSeqVar "TI+" PlusOp) (TSortSeq (TName "thread-ids") PlusOp)] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- lifted_sideCondition (SCEquality (TApp "is-in-set" [TVar "TI",TSet [TVar "TI+"]]) (TName "false")) env
            env <- lifted_sideCondition (SCEquality (TApp "is-subset" [TSet [TVar "TI+"],TVar "ATS"]) (TName "true")) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "set-difference" [TVar "ATS",TSet [TVar "TI+"]]) [VPMetaVar "ATS'"]) env
            putMutTerm "thread-stepping" (TVar "TI") env
            putMutTerm "active-thread-set" (TVar "ATS'") env
            stepTermTo (TName "null-value") env
          step2 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPSeqVar "TI+" PlusOp) (TSortSeq (TName "thread-ids") PlusOp)] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- lifted_sideCondition (SCEquality (TApp "is-in-set" [TVar "TI",TSet [TVar "TI+"]]) (TName "true")) env
            env <- lifted_sideCondition (SCEquality (TApp "is-subset" [TSet [TVar "TI+"],TVar "ATS"]) (TName "true")) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "set-difference" [TVar "ATS",TSet [TVar "TI+"]]) [VPMetaVar "ATS'"]) env
            putMutTerm "thread-stepping" (TSeq []) env
            putMutTerm "active-thread-set" (TVar "ATS'") env
            stepTermTo (TName "null-value") env

thread_resume_ fargs = FApp "thread-resume" (fargs)
stepThread_resume fargs =
    evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPSeqVar "TI*" StarOp) (TSortSeq (TName "thread-ids") StarOp)] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- lifted_sideCondition (SCEquality (TApp "is-in-set" [TVar "TI",TSet [TVar "TI*"]]) (TName "false")) env
            env <- lifted_sideCondition (SCEquality (TApp "set-intersect" [TVar "ATS",TSet [TVar "TI*"]]) (TSet [])) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "set-unite" [TVar "ATS",TSet [TVar "TI*"]]) [VPMetaVar "ATS'"]) env
            putMutTerm "thread-stepping" (TVar "TI") env
            putMutTerm "active-thread-set" (TVar "ATS'") env
            stepTermTo (TName "null-value") env

thread_terminate_ fargs = FApp "thread-terminate" (fargs)
stepThread_terminate fargs =
    evalRules [] [step1,step2]
    where step1 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI'") (TName "thread-ids")] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- lifted_sideCondition (SCPatternMatch (TApp "lookup" [TVar "TM",TVar "TI'"]) [PADT "thread" [PADT "thunk" [PADT "abstraction" [VPMetaVar "X"]]]]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-delete" [TVar "TM",TSet [TVar "TI'"]]) [VPMetaVar "TM'"]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "set-difference" [TVar "ATS",TSet [TVar "TI'"]]) [VPMetaVar "ATS'"]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "when-true" [TApp "not" [TApp "is-equal" [TVar "TI",TVar "TI'"]],TVar "TI"]) [VPSeqVar "TI?" QuestionMarkOp]) env
            putMutTerm "thread-stepping" (TVar "TI?") env
            putMutTerm "thread-map" (TVar "TM'") env
            putMutTerm "active-thread-set" (TVar "ATS'") env
            stepTermTo (TName "null-value") env
          step2 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI'") (TName "thread-ids"),VPAnnotated (VPMetaVar "V") (TName "values")] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM"] env
            env <- getMutPatt "terminated-thread-map" [VPMetaVar "TVM"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- lifted_sideCondition (SCPatternMatch (TApp "lookup" [TVar "TM",TVar "TI'"]) [PADT "thread" [PADT "thunk" [PADT "abstraction" [VPMetaVar "X"]],PADT "datatype-value" [VPLit (ADTVal "list" [FValue (ADTVal "unicode-character" [FValue (Int 108)]),FValue (ADTVal "unicode-character" [FValue (Int 105)]),FValue (ADTVal "unicode-character" [FValue (Int 115)]),FValue (ADTVal "unicode-character" [FValue (Int 116)])]),VPSeqVar "TI*" StarOp]]]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-delete" [TVar "TM",TSet [TVar "TI'"]]) [VPMetaVar "TM'"]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "set-unite" [TApp "set-difference" [TVar "ATS",TSet [TVar "TI'"]],TSet [TVar "TI*"]]) [VPMetaVar "ATS'"]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-unite" [TVar "TVM",TMap [TBinding (TVar "TI'") (TVar "V")]]) [VPMetaVar "TVM'"]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "when-true" [TApp "not" [TApp "is-equal" [TVar "TI",TVar "TI'"]],TVar "TI"]) [VPSeqVar "TI?" QuestionMarkOp]) env
            putMutTerm "thread-stepping" (TVar "TI?") env
            putMutTerm "thread-map" (TVar "TM'") env
            putMutTerm "terminated-thread-map" (TVar "TVM'") env
            putMutTerm "active-thread-set" (TVar "ATS'") env
            stepTermTo (TName "null-value") env

is_thread_terminated_ fargs = FApp "is-thread-terminated" (fargs)
stepIs_thread_terminated fargs =
    evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI") (TName "thread-ids")] env
            env <- getMutPatt "terminated-thread-map" [VPMetaVar "TVM"] env
            stepTermTo (TApp "is-value" [TApp "map-lookup" [TVar "TVM",TVar "TI"]]) env

thread_value_ fargs = FApp "thread-value" (fargs)
stepThread_value fargs =
    evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI") (TName "thread-ids")] env
            env <- getMutPatt "terminated-thread-map" [VPMetaVar "TVM"] env
            stepTermTo (TApp "checked" [TApp "map-lookup" [TVar "TVM",TVar "TI"]]) env

thread_join_ fargs = FApp "thread-join" (fargs)
stepThread_join fargs =
    evalRules [] [step1,step2,step3,step4]
    where step1 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI'") (TName "thread-ids")] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM"] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- lifted_sideCondition (SCPatternMatch (TApp "lookup" [TVar "TM",TVar "TI'"]) [PADT "thread" [VPMetaVar "TH",PADT "datatype-value" [VPLit (ADTVal "list" [FValue (ADTVal "unicode-character" [FValue (Int 108)]),FValue (ADTVal "unicode-character" [FValue (Int 105)]),FValue (ADTVal "unicode-character" [FValue (Int 115)]),FValue (ADTVal "unicode-character" [FValue (Int 116)])]),VPSeqVar "TI*" StarOp]]]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-override" [TMap [TBinding (TVar "TI'") (TApp "thread" [TVar "TH",TApp "list" [TVar "TI*",TVar "TI"]])],TVar "TM"]) [VPMetaVar "TM'"]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "set-difference" [TVar "ATS",TSet [TVar "TI"]]) [VPMetaVar "ATS'"]) env
            putMutTerm "thread-map" (TVar "TM'") env
            putMutTerm "thread-stepping" (TSeq []) env
            putMutTerm "active-thread-set" (TVar "ATS'") env
            stepTermTo (TName "null-value") env
          step2 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI'") (TName "thread-ids")] env
            env <- getMutPatt "terminated-thread-map" [VPMetaVar "TVM"] env
            env <- lifted_sideCondition (SCEquality (TApp "is-value" [TApp "lookup" [TVar "TVM",TVar "TI'"]]) (TName "true")) env
            stepTermTo (TName "null-value") env
          step3 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI'") (TName "thread-ids")] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM"] env
            env <- lifted_sideCondition (SCPatternMatch (TApp "lookup" [TVar "TM",TVar "TI'"]) [PADT "thread" [VPMetaVar "TH"]]) env
            stepTermTo (TName "fail") env
          step4 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI'") (TName "thread-ids")] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM"] env
            env <- getMutPatt "terminated-thread-map" [VPMetaVar "TVM"] env
            env <- lifted_sideCondition (SCEquality (TApp "lookup" [TVar "TM",TVar "TI'"]) (TSeq [])) env
            env <- lifted_sideCondition (SCEquality (TApp "lookup" [TVar "TVM",TVar "TI'"]) (TSeq [])) env
            stepTermTo (TName "fail") env

thread_exterminate_ fargs = FApp "thread-exterminate" (fargs)
stepThread_exterminate fargs =
    evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "TI'") (TName "thread-ids")] env
            env <- getMutPatt "thread-map" [VPMetaVar "TM"] env
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getMutPatt "terminated-thread-map" [VPMetaVar "TVM"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- lifted_sideCondition (SCInequality (TVar "TI'") (TVar "TI")) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-delete" [TVar "TM",TSet [TVar "TI'"]]) [VPMetaVar "TM'"]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "map-delete" [TVar "TVM",TSet [TVar "TI'"]]) [VPMetaVar "TVM'"]) env
            env <- lifted_sideCondition (SCPatternMatch (TApp "set-difference" [TVar "ATS",TSet [TVar "TI'"]]) [VPMetaVar "ATS'"]) env
            putMutTerm "thread-map" (TVar "TM'") env
            putMutTerm "thread-stepping" (TVar "TI") env
            putMutTerm "terminated-thread-map" (TVar "TVM'") env
            putMutTerm "active-thread-set" (TVar "ATS'") env
            stepTermTo (TName "null-value") env

update_thread_stepping_ = FName "update-thread-stepping"
stepUpdate_thread_stepping = evalRules [] [step1,step2,step3,step4]
    where step1 = do
            let env = emptyEnv
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- premise (TApp "is-thread-preemptible" [TVar "TI"]) [PValue (PADT "false" [])] env
            stepTermTo (TName "null-value") env
          step2 = do
            let env = emptyEnv
            env <- getMutPatt "thread-stepping" [VPMetaVar "TI"] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- premise (TApp "is-thread-preemptible" [TVar "TI"]) [PValue (PADT "true" [])] env
            env <- lifted_sideCondition (SCPatternMatch (TApp "some-element" [TVar "ATS"]) [VPMetaVar "TI'"]) env
            putMutTerm "thread-stepping" (TVar "TI'") env
            stepTermTo (TName "null-value") env
          step3 = do
            let env = emptyEnv
            env <- getMutPatt "thread-stepping" [] env
            env <- getMutPatt "active-thread-set" [VPMetaVar "ATS"] env
            env <- lifted_sideCondition (SCPatternMatch (TApp "some-element" [TVar "ATS"]) [VPMetaVar "TI'"]) env
            putMutTerm "thread-stepping" (TVar "TI'") env
            stepTermTo (TName "null-value") env
          step4 = do
            let env = emptyEnv
            env <- getMutPatt "thread-stepping" [VPSeqVar "TI?" QuestionMarkOp] env
            env <- getMutPatt "active-thread-set" [PADT "set" []] env
            putMutTerm "thread-stepping" (TSeq []) env
            stepTermTo (TName "null-value") env

update_thread_schedule_ fargs = FApp "update-thread-schedule" (fargs)
stepUpdate_thread_schedule fargs =
    evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            env <- lifted_vsMatch fargs [VPAnnotated (VPMetaVar "VS") (TApp "sets" [TName "ground-values"])] env
            putMutTerm "thread-schedule" (TVar "VS") env
            stepTermTo (TName "null-value") env

current_thread_schedule_ = FName "current-thread-schedule"
stepCurrent_thread_schedule = evalRules [] [step1]
    where step1 = do
            let env = emptyEnv
            env <- getMutPatt "thread-schedule" [VPMetaVar "VS"] env
            stepTermTo (TVar "VS") env

thread_preemptible_ = FName "thread-preemptible"
stepThread_preemptible = evalRules [rewrite1] []
    where rewrite1 = do
            let env = emptyEnv
            rewriteTermTo (TApp "datatype-value" [TFuncon (FValue (ADTVal "list" [FValue (ADTVal "unicode-character" [FValue (Int 116)]),FValue (ADTVal "unicode-character" [FValue (Int 104)]),FValue (ADTVal "unicode-character" [FValue (Int 114)]),FValue (ADTVal "unicode-character" [FValue (Int 101)]),FValue (ADTVal "unicode-character" [FValue (Int 97)]),FValue (ADTVal "unicode-character" [FValue (Int 100)]),FValue (ADTVal "unicode-character" [FValue (Int 45)]),FValue (ADTVal "unicode-character" [FValue (Int 112)]),FValue (ADTVal "unicode-character" [FValue (Int 114)]),FValue (ADTVal "unicode-character" [FValue (Int 101)]),FValue (ADTVal "unicode-character" [FValue (Int 101)]),FValue (ADTVal "unicode-character" [FValue (Int 109)]),FValue (ADTVal "unicode-character" [FValue (Int 112)]),FValue (ADTVal "unicode-character" [FValue (Int 116)]),FValue (ADTVal "unicode-character" [FValue (Int 105)]),FValue (ADTVal "unicode-character" [FValue (Int 98)]),FValue (ADTVal "unicode-character" [FValue (Int 108)]),FValue (ADTVal "unicode-character" [FValue (Int 101)])]))]) env

thread_cooperative_ = FName "thread-cooperative"
stepThread_cooperative = evalRules [rewrite1] []
    where rewrite1 = do
            let env = emptyEnv
            rewriteTermTo (TApp "datatype-value" [TFuncon (FValue (ADTVal "list" [FValue (ADTVal "unicode-character" [FValue (Int 116)]),FValue (ADTVal "unicode-character" [FValue (Int 104)]),FValue (ADTVal "unicode-character" [FValue (Int 114)]),FValue (ADTVal "unicode-character" [FValue (Int 101)]),FValue (ADTVal "unicode-character" [FValue (Int 97)]),FValue (ADTVal "unicode-character" [FValue (Int 100)]),FValue (ADTVal "unicode-character" [FValue (Int 45)]),FValue (ADTVal "unicode-character" [FValue (Int 99)]),FValue (ADTVal "unicode-character" [FValue (Int 111)]),FValue (ADTVal "unicode-character" [FValue (Int 111)]),FValue (ADTVal "unicode-character" [FValue (Int 112)]),FValue (ADTVal "unicode-character" [FValue (Int 101)]),FValue (ADTVal "unicode-character" [FValue (Int 114)]),FValue (ADTVal "unicode-character" [FValue (Int 97)]),FValue (ADTVal "unicode-character" [FValue (Int 116)]),FValue (ADTVal "unicode-character" [FValue (Int 105)]),FValue (ADTVal "unicode-character" [FValue (Int 118)]),FValue (ADTVal "unicode-character" [FValue (Int 101)])]))]) env

is_thread_preemptible_ fargs = FApp "is-thread-preemptible" (fargs)
stepIs_thread_preemptible fargs =
    evalRules [rewrite1] []
    where rewrite1 = do
            let env = emptyEnv
            env <- vsMatch fargs [VPAnnotated VPWildCard (TName "thread-ids")] env
            rewriteTermTo (TApp "not" [TApp "is-in-set" [TName "thread-cooperative",TName "current-thread-schedule"]]) env

thread_ids_ = FName "thread-ids"
stepThread_ids = rewriteType "thread-ids" []

threads_ = FName "threads"
stepThreads = rewriteType "threads" []

thread_preemtibilities_ = FName "thread-preemtibilities"
stepThread_preemtibilities = rewriteType "thread-preemtibilities" []