Project Description
Translate the Prolog Task, into a Haskell Task
% Muhsen “badeed” Saleh
% Homework 3
% Made with help from https://www.tutorialspoint.com/prolog/index.htm and CS320 discord
rhs(NUM1, NUM2, I) :-
I_ is I – 1, I > 1, between(1, I_ ,A), between(1, I_, B), expression(NUM1, A), expression(NUM2, B), I is A + B.
expression(10, 1).
expression(NUM1 + NUM2, I) :- rhs(NUM1, NUM2 , I).
expression(NUM1 – NUM2, I) :- rhs(NUM1, NUM2 , I).
expression(NUM1 * NUM2, I) :- rhs(NUM1, NUM2 , I).
expression(NUM1 / NUM2, I) :- rhs(NUM1, NUM2 , I), BOT is NUM2, BOT > 0, TOP is NUM1, 0 is mod(TOP,BOT).
important_nums(I) :- expression(NUM1, I), RES is NUM1, between(0, 9, RES), write(NUM1), write(‘ = ‘), write(RES), nl.
main :-
write(‘Expressions of interest2: ‘), nl, aggregate_all(count, important_nums(4), Count), nl, write(‘Total expressions ofinterest: ‘), write(Count), nl.
Haskell coding which is converted
import Data.List
data Expr a = Plus (Expr a) (Expr a) | Minus (Expr a) (Expr a) | Divide (Expr a) (Expr a) | Multiply (Expr a) (Expr a) | Value Integer | NullExpr
— add’ :: Expr a -> Expr a
add a b = Plus a b
— subtract’ :: Expr a -> Expr a
subtract’ a b = Minus a b
— div’ :: Expr a -> Expr a
div’ a b = Divide a b
— mul’ :: Expr a -> Expr a
mul’ a b = Multiply a b
evaluate :: Expr a -> Integer
evaluate NullExpr = -0xdeadbeef
evaluate (Value a) = a
evaluate (Plus a b) = (evaluate a) + (evaluate b)
evaluate (Minus a b) = (evaluate a) – (evaluate b)
evaluate (Divide a b)
| y == 0 = evaluate NullExpr
| x `mod` y == 0 = x `div` y
| otherwise = evaluate NullExpr
where x = evaluate a
y = evaluate b
evaluate (Multiply a b) = (evaluate a) * (evaluate b)
instance Show (Expr a) where
show (NullExpr) = “”
show (Plus a b) = (show a) ++ “+” ++ (show b)
show (Minus a b) = (show a) ++ “-” ++ (show b)
show (Divide (Value a) (Value b)) = (show a) ++ “/” ++ (show b)
show (Divide (Value a) b) = (show a) ++ “/(” ++ (show b) ++ “)”
show (Divide a (Value b)) = “(” ++ (show a) ++ “)/” ++ (show b)
show (Divide a b) = “(” ++ (show a) ++ “)/(” ++ (show b) ++ “)”
show (Multiply (Value a) (Value b)) = (show a) ++ “*” ++ (show b)
show (Multiply (Value a) b) = (show a) ++ “/(” ++ (show b) ++ “)”
show (Multiply a (Value b)) = “(” ++ (show a) ++ “)/” ++ (show b)
show (Multiply a b) = “(” ++ (show a) ++ “)*(” ++ (show b) ++ “)”
show (Value a) = (show a)
length’ :: Expr a -> Integer
length’ (Value a) = 1
length’ (Plus a b) = (length’ a) + (length’ b)
length’ (Minus a b) = (length’ a) + (length’ b)
length’ (Divide a b) = (length’ a) + (length’ b)
length’ (Multiply a b) = (length’ a) + (length’ b)
valsofinterest :: (Eq t, Num t) => t -> [Expr a]
valsofinterest 1 = [Value 10]
valsofinterest n = (map (\(x, y) -> Plus x y) prod) ++
(map (\(x, y) -> Minus x y) prod) ++
(map (\(x, y) -> Divide x y) prod) ++
(map (\(x, y) -> Multiply x y) prod) ++ xs
where prod = [(x, y) | x <- xs, y <- xs]
xs = valsofinterest (n – 1)
showexprsofinterest :: [String]
showexprsofinterest = nub $ map
(\x -> (show x) ++ ” = ” ++ (show (evaluate x))) $
filter (\x -> (evaluate x) < 10 &&
(evaluate x) >= 0 &&
(length’ x) == 4)
(valsofinterest 4)
Project Details
- Date November 24, 2021
- Tags Functional programming, Haskell Programming, Programming
Comments are closed.