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
    Trustpilot