@@ -41,7 +41,8 @@ import PlutusCore.StdLib.Data.Unit
41
41
import PlutusCore.StdLib.Meta
42
42
import PlutusCore.StdLib.Type
43
43
44
- import Data.List (genericIndex )
44
+ import Control.Monad.Morph (hoist )
45
+ import Data.List (genericIndex , scanl' )
45
46
import Hedgehog hiding (Size , Var )
46
47
import Hedgehog.Gen qualified as Gen
47
48
import Hedgehog.Range qualified as Range
@@ -95,28 +96,39 @@ factorial = runQuote $ do
95
96
-- > (\(u : unit) -> addInteger
96
97
-- > (rec (subtractInteger i 1))
97
98
-- > (rec (subtractInteger i 2))))
98
- naiveFib :: Integer -> Term TyName Name DefaultUni DefaultFun ()
99
- naiveFib iv = runQuote $ do
99
+ getNaiveFib
100
+ :: MonadQuote m
101
+ => [(VarDecl TyName Name DefaultUni () , Term TyName Name DefaultUni DefaultFun () )]
102
+ -> Integer
103
+ -> m (Term TyName Name DefaultUni DefaultFun () )
104
+ getNaiveFib args iv = do
100
105
rec <- freshName " rec"
101
106
i <- freshName " i"
102
107
u <- freshName " u"
103
108
let
104
109
intS = mkTyBuiltin @ _ @ Integer ()
105
110
fib = Fix () rec (TyFun () intS intS)
106
- . LamAbs () i intS
107
- $ mkIterAppNoAnn (TyInst () ifThenElse intS)
108
- [ mkIterAppNoAnn (Builtin () LessThanEqualsInteger )
109
- [Var () i, mkConstant @ Integer () 1 ]
110
- , LamAbs () u unit $ Var () i
111
- , LamAbs () u unit $ mkIterAppNoAnn (Builtin () AddInteger )
112
- [ Apply () (Var () rec ) $ mkIterAppNoAnn (Builtin () SubtractInteger )
111
+ . mkIterAppNoAnn
112
+ ( mkIterLamAbs (Prelude. map fst args)
113
+ . LamAbs () i intS
114
+ $ mkIterAppNoAnn (TyInst () ifThenElse intS)
115
+ [ mkIterAppNoAnn (Builtin () LessThanEqualsInteger )
113
116
[Var () i, mkConstant @ Integer () 1 ]
114
- , Apply () (Var () rec ) $ mkIterAppNoAnn (Builtin () SubtractInteger )
115
- [Var () i, mkConstant @ Integer () 2 ]
117
+ , LamAbs () u unit $ Var () i
118
+ , LamAbs () u unit $ mkIterAppNoAnn (Builtin () AddInteger )
119
+ [ Apply () (Var () rec ) $ mkIterAppNoAnn (Builtin () SubtractInteger )
120
+ [Var () i, mkConstant @ Integer () 1 ]
121
+ , Apply () (Var () rec ) $ mkIterAppNoAnn (Builtin () SubtractInteger )
122
+ [Var () i, mkConstant @ Integer () 2 ]
123
+ ]
116
124
]
117
- ]
125
+ )
126
+ $ Prelude. map snd args
118
127
pure . Apply () fib $ mkConstant @ Integer () iv
119
128
129
+ naiveFib :: Integer -> Term TyName Name DefaultUni DefaultFun ()
130
+ naiveFib = runQuote . getNaiveFib []
131
+
120
132
-- | Generate a term that computes the factorial of an @integer@ and return it
121
133
-- along with the factorial of the corresponding 'Integer' computed on the Haskell side.
122
134
genFactorial :: TermGen Integer
@@ -129,11 +141,17 @@ genFactorial = do
129
141
-- | Generate a term that computes the ith Fibonacci number and return it
130
142
-- along with the corresponding 'Integer' computed on the Haskell side.
131
143
genNaiveFib :: TermGen Integer
132
- genNaiveFib = do
133
- let fibs = scanl (+) 0 $ 1 : fibs
144
+ genNaiveFib = hoist ( pure . runQuote) $ do
145
+ let fibs = scanl' (+) 0 $ 1 : fibs
134
146
m = 16
147
+ argsN = 8
135
148
iv <- Gen. integral $ Range. linear 0 m
136
- return . TermOf (naiveFib iv) $ fibs `genericIndex` iv
149
+ args <- Gen. list (Range. linear 0 $ fromInteger argsN) $
150
+ withAnyTermLoose $ \ proxy@ (TermOf arg _) -> do
151
+ argName <- freshName " arg"
152
+ pure (VarDecl () argName $ toTypeAst proxy, arg)
153
+ fib <- getNaiveFib args iv
154
+ return . TermOf fib $ fibs `genericIndex` iv
137
155
138
156
-- | Generate an 'Integer', turn it into a Scott-encoded PLC @Nat@ (see 'Nat'),
139
157
-- turn that @Nat@ into the corresponding PLC @integer@ using a fold (see 'FoldNat')
0 commit comments