diff options
| author | Mirek Kratochvil <exa.exa@gmail.com> | 2022-11-12 17:47:51 +0100 |
|---|---|---|
| committer | Mirek Kratochvil <exa.exa@gmail.com> | 2022-11-12 17:47:51 +0100 |
| commit | b9633a33182f5b381e912366273709e59f469bb9 (patch) | |
| tree | 0b7eb7f1e67792253cfaf9caee3a92570ab60407 /app/Code.hs | |
| parent | fe6666d204c0728b4556574ddc184bc46013b193 (diff) | |
| download | prlg-b9633a33182f5b381e912366273709e59f469bb9.tar.gz prlg-b9633a33182f5b381e912366273709e59f469bb9.tar.bz2 | |
reorg.
Diffstat (limited to 'app/Code.hs')
| -rw-r--r-- | app/Code.hs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/app/Code.hs b/app/Code.hs new file mode 100644 index 0000000..3488f0b --- /dev/null +++ b/app/Code.hs @@ -0,0 +1,56 @@ +module Code where + +import qualified Data.Map as M +import IR (Id(..)) + +data Datum + = Atom Int -- unifies a constant + | Struct Id -- unifies a structure with arity + | VoidRef -- unifies with anything + | LocalRef Int -- code-local variable idx (should not occur on heap) + | HeapRef Int -- heap structure idx + deriving (Show, Eq, Ord) + +data Instr + = U Datum -- something unifiable + | NoGoal -- trivial goal + | Goal -- we start a new goal, set up backtracking etc + | Call -- all seems okay, call the goal + | LastCall -- tail call the goal + | Cut -- remove all alternative clauses of the current goal + deriving (Show) + +type Code = [Instr] + +type Defs = M.Map Id [Code] + +data Heap = + Heap Int (M.Map Int Datum) + deriving (Show) + +emptyHeap = Heap 0 M.empty + +type Scope = M.Map Int Int + +emptyScope :: Scope +emptyScope = M.empty + +data Cho = + Cho + { hed :: Code -- head pointer + , hvar :: Scope -- variables unified in head (so far) + , gol :: Code -- goal pointer + , gvar :: Scope -- variables unified in the goal + , heap :: Heap -- a snapshot of the heap (there's no trail; we rely on CoW copies in other choicepoints) + , stk :: [(Code, Scope, [Cho])] -- remaining goals together with their vars and cuts + , cut :: [Cho] -- snapshot of choicepoints before entering + } + deriving (Show) + +data Interp = + Interp + { defs :: Defs -- global definitions for lookup (TODO can we externalize?) + , cur :: Cho -- the choice that is being evaluated right now + , cho :: [Cho] -- remaining choice points + } + deriving (Show) |
