small things
This commit is contained in:
parent
336feaeba0
commit
45c3f81891
|
@ -51,7 +51,8 @@ data Cho =
|
|||
, _retcut :: Bool -- cut after this goal succeeds
|
||||
, _heap :: Heap -- a snapshot of the heap (there's no trail; we rely on CoW copies in other choicepoints)
|
||||
, _stk :: [(Code, Scope, [Cho], Bool)] -- remaining goals together with their vars, cuts, and ret-cut flag
|
||||
, _cut :: [Cho] -- snapshot of choicepoints before entering
|
||||
, _cut :: [Cho] -- snapshot of choicepoints before entering the goal
|
||||
, _hcut :: [Cho] -- save of choicepoints just before starting to match head
|
||||
}
|
||||
deriving (Show)
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@ prove g = do
|
|||
, _heap = emptyHeap
|
||||
, _stk = []
|
||||
, _cut = []
|
||||
, _hcut = []
|
||||
}
|
||||
cho .= []
|
||||
loop
|
||||
|
@ -54,10 +55,14 @@ proveStep = do
|
|||
import Control.Monad.Trans.Class (lift)
|
||||
import System.Console.Haskeline
|
||||
g <- use (cur . gol)
|
||||
cho <- use cho
|
||||
cut <- use (cur . cut)
|
||||
lift $ do
|
||||
outputStrLn $ "STEP (unis="++show u++")"
|
||||
outputStrLn $ "head = "++ show h
|
||||
outputStrLn $ "goal = "++ show g
|
||||
outputStrLn $ "cut = " ++ show cut
|
||||
outputStrLn $ "cho = " ++ show cho
|
||||
-}
|
||||
case (u, h) of
|
||||
(0, []) -> goalStep
|
||||
|
@ -92,7 +97,7 @@ headStep h = do
|
|||
case (h, g) of
|
||||
([Done], _) -> succeedHead
|
||||
(Cut:_, _) -> cutHead
|
||||
(Invoke (Builtin bf):_, _) -> advanceHead >> bf
|
||||
(Invoke (Builtin bf):_, _) -> cur . hed .= [Done] >> bf
|
||||
(_, [Done]) -> tailCall
|
||||
(_, [Cut, Done]) -> tailCut
|
||||
(_, _) -> pushCall
|
||||
|
@ -134,7 +139,9 @@ retCut = do
|
|||
doCut
|
||||
cur . retcut .= False
|
||||
|
||||
cutHead = doCut >> advanceHead
|
||||
cutHead = do
|
||||
use (cur . hcut) >>= assign cho
|
||||
advanceHead
|
||||
|
||||
cutGoal = doCut >> advance
|
||||
|
||||
|
@ -147,7 +154,8 @@ openGoal fn = do
|
|||
cur . hvar .= emptyScope
|
||||
cur . unis .= arity fn
|
||||
cc <- use cur
|
||||
let (newcur:newcho) = [cc & hed .~ h | h <- hs]
|
||||
oldcho <- use cho
|
||||
let (newcur:newcho) = [cc & hcut .~ oldcho & hed .~ h | h <- hs]
|
||||
cur .= newcur
|
||||
cho %= (newcho ++)
|
||||
continue
|
||||
|
@ -162,12 +170,15 @@ pushCall = do
|
|||
ngol <- use (cur . hed)
|
||||
ngvar <- use (cur . hvar)
|
||||
scut <- use (cur . cut)
|
||||
ncut <- use (cur . hcut)
|
||||
sretcut <- use (cur . retcut)
|
||||
cur . stk %= ((sgol, sgvar, scut, sretcut) :)
|
||||
cur . gol .= ngol
|
||||
cur . gvar .= ngvar
|
||||
cur . cut .= ncut
|
||||
cur . hed .= []
|
||||
cur . hvar .= emptyScope
|
||||
cur . hcut .= []
|
||||
cur . retcut .= False
|
||||
continue
|
||||
|
||||
|
@ -179,6 +190,7 @@ tailCall = do
|
|||
cur . gvar .= ngvar
|
||||
cur . hed .= []
|
||||
cur . hvar .= emptyScope
|
||||
cur . hcut .= []
|
||||
continue
|
||||
|
||||
tailCut :: InterpFn
|
||||
|
@ -189,8 +201,9 @@ tailCut = do
|
|||
|
||||
succeedHead :: InterpFn
|
||||
succeedHead = do
|
||||
cur . hvar .= emptyScope
|
||||
cur . hed .= []
|
||||
cur . hvar .= emptyScope
|
||||
cur . hcut .= []
|
||||
continue
|
||||
|
||||
succeedGoal :: InterpFn
|
||||
|
|
|
@ -45,17 +45,8 @@ Ax > Bx :- A is Ax, B is Bx, int2p_lt(B,A).
|
|||
Ax >= Bx :- A is Ax, B is Bx, int2p_leq(B,A).
|
||||
zero(Ax) :- A is Ax, int1p_zero(A).
|
||||
|
||||
gcd(X,Y,R) :- writeln(a), fail.
|
||||
gcd(X,Y,R) :- writeln(b), zero(Y), !, R=X.
|
||||
gcd(X,Y,R) :- writeln(c), X1 is X mod Y, gcd(Y,X1,R).
|
||||
gcd(X,Y,R) :- writeln(a), Y > X, writeln(wat), !, gcd(Y,X,R).
|
||||
gcd(X,Y,R) :- writeln(b), zero(Y), !, R=X.
|
||||
gcd(X,Y,R) :- writeln(c), X1 is X mod Y, gcd(Y,X1,R).
|
||||
gcd(X,Y,R) :- Y > X, !, gcd(Y,X,R).
|
||||
gcd(X,Y,R) :- zero(Y), !, R=X.
|
||||
gcd(X,Y,R) :- X1 is X mod Y, gcd(Y,X1,R).
|
||||
|
||||
test(X) :- writeln(there), zero(X), fail.
|
||||
test(X) :- writeln(here).
|
||||
|
||||
test :- writeln(a), a=a, !, fail.
|
||||
test :- writeln(b).
|
||||
|
||||
xxx :- test.
|
||||
lcm(X,Y,R) :- gcd(X,Y,GCD), R is X*(Y/GCD).
|
||||
|
|
Loading…
Reference in a new issue