### 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.