summaryrefslogtreecommitdiff
path: root/app/Code.hs
diff options
context:
space:
mode:
authorMirek Kratochvil <exa.exa@gmail.com>2022-11-12 17:47:51 +0100
committerMirek Kratochvil <exa.exa@gmail.com>2022-11-12 17:47:51 +0100
commitb9633a33182f5b381e912366273709e59f469bb9 (patch)
tree0b7eb7f1e67792253cfaf9caee3a92570ab60407 /app/Code.hs
parentfe6666d204c0728b4556574ddc184bc46013b193 (diff)
downloadprlg-b9633a33182f5b381e912366273709e59f469bb9.tar.gz
prlg-b9633a33182f5b381e912366273709e59f469bb9.tar.bz2
reorg.
Diffstat (limited to 'app/Code.hs')
-rw-r--r--app/Code.hs56
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)