code-conjure-0.6.4: eg/colin/ListFuns.hs
--- 2021, 2025 Colin Runciman
import Conjure
import Prelude hiding (sum, take, drop)
sum :: [Int] -> Int
sum [] = 0
sum [0,1] = 1
sum [1,0,1] = 2
-- hoping for something like
-- sum [] = 0
-- sum (x:xs) = x + sum xs
sumBackground :: [Prim]
sumBackground =
[ pr (0::Int)
, prim "+" ((+) :: Int -> Int -> Int)
]
app :: [Int] -> [Int] -> [Int]
app [] [0,1] = [0,1]
app [0,1] [] = [0,1]
app [0,1] [0,1] = [0,1,0,1]
-- hoping for something like
-- app [] ys = ys
-- app (x:xs) ys = x : app xs ys
appBackground :: [Prim]
appBackground =
[ prim ":" ((:) :: Int -> [Int] -> [Int])
]
mem :: Int -> [Int] -> Bool
mem 0 [] = False
mem 0 [0,1,1] = True
mem 0 [1,0,1] = True
mem 0 [1,1,0] = True
mem 0 [1,1,1] = False
-- hoping for something like
-- mem x [] = False
-- mem x (y:ys) = x == y || mem x ys
memBackground :: [Prim]
memBackground =
[ pr False
, prim "==" ((==) :: Int -> Int -> Bool)
, prim "&&" ((&&) :: Bool -> Bool -> Bool)
, prim "||" ((||) :: Bool -> Bool -> Bool)
]
sub :: [Int] -> [Int] -> Bool
sub [] [] = True
sub [] [0,1] = True
sub [0] [0,1] = True
sub [1] [0,1] = True
sub [2] [0,1] = False
sub [0,1] [0,1] = True
sub [1,0] [0,1] = False
sub [0,2] [0,1] = False
sub [2,0] [0,1] = False
-- Hoping for something like:
-- sub :: [Int] -> [Int] -> Bool
-- sub [] _ = True
-- sub _ [] = False
-- sub (x:xs) (y:ys) = x == y && sub xs ys || sub (x:xs) ys
subBackground :: [Prim]
subBackground =
[ pr True
, pr False
, prim ":" ((:) :: Int -> [Int] -> [Int])
, prim "==" ((==) :: Int -> Int -> Bool)
, prim "&&" ((&&) :: Bool -> Bool -> Bool)
, prim "||" ((||) :: Bool -> Bool -> Bool)
]
set :: [Int] -> Bool
set [] = True
set [0] = True
set [0,0] = False
set [0,1] = True
set [0,1,2] = True
set [0,0,1] = False
set [0,1,0] = False
set [0,1,1] = False
-- hoping for something like
-- set [] = True
-- set (x:xs) = not (elem x xs) && set xs
setBackground :: [Prim]
setBackground =
[ prim "not" (not :: Bool -> Bool)
, prim "&&" ((&&) :: Bool -> Bool -> Bool)
, prim "elem" (elem :: Int -> [Int] -> Bool)
]
take :: Int -> [A] -> [A]
take 0 [] = []
take 1 [] = []
take 0 [x,y] = []
take 1 [x,y] = [x]
take 2 [x,y] = [x,y]
take 3 [x,y] = [x,y]
-- hoping for something like
-- take 0 xs = []
-- take x [] = []
-- take x (y:ys) = y : take (x-1) ys
takeBackground :: [Prim]
takeBackground =
[ pr (0 :: Int)
, pr (1 :: Int)
, pr ([] :: [A])
, prim "-" ((-) :: Int -> Int -> Int)
, prim ":" ((:) :: A -> [A] -> [A])
]
drop :: Int -> [A] -> [A]
drop 0 [] = []
drop 1 [] = []
drop 0 [x,y] = [x,y]
drop 1 [x,y] = [y]
drop 2 [x,y] = []
drop 3 [x,y] = []
-- hoping for something like
-- drop 0 xs = xs
-- drop x [] = []
-- drop x (y:ys) = drop (x-1) ys
dropBackground :: [Prim]
dropBackground =
[ pr (0 :: Int)
, pr (1 :: Int)
, pr ([] :: [A])
, prim "-" ((-) :: Int -> Int -> Int)
]
main :: IO ()
main = do
conjure "sum" sum sumBackground
conjure "app" app appBackground
conjure "mem" mem memBackground
conjureWith args{maxSize=15,showCandidates=False} "sub" sub subBackground
conjure "set" set setBackground
conjure "take" take takeBackground
conjure "drop" drop dropBackground