packages feed

g2-0.1.0.1: tests/PeanoTest.hs

{-# LANGUAGE OverloadedStrings #-}

module PeanoTest where

import G2.Language

import TestUtils

zeroPeano :: Expr
zeroPeano =
    Data $ DataCon (Name "Zero" (Just "Peano") 0 Nothing) (TyCon (Name "Peano" (Just "Peano") 0 Nothing) TYPE)

succPeano :: Expr -> Expr
succPeano x =
    App (Data $ DataCon (Name "Succ" (Just "Peano") 0 Nothing) (TyCon (Name "Peano" (Just "Peano") 0 Nothing) TYPE)) x

peano_0_4 :: [Expr] -> Bool
peano_0_4 [a, b, c] = a `eqIgT` zeroPeano && b `eqIgT` (succPeano . succPeano . succPeano . succPeano $ zeroPeano)
                      && c `eqIgT` (succPeano . succPeano . succPeano . succPeano $ zeroPeano)
peano_0_4 _ = False

peano_1_3 :: [Expr] -> Bool
peano_1_3 [a, b, c] = a `eqIgT` (succPeano $ zeroPeano) && b `eqIgT` (succPeano . succPeano . succPeano $ zeroPeano)
                   && c `eqIgT` (succPeano . succPeano . succPeano . succPeano $ zeroPeano)
peano_1_3 _ = False

peano_1_4 :: [Expr] -> Bool
peano_1_4 [a, b, c] = a `eqIgT` (succPeano $ zeroPeano) && b `eqIgT` (succPeano . succPeano . succPeano . succPeano $ zeroPeano)
                      && c `eqIgT` (succPeano . succPeano . succPeano . succPeano $ zeroPeano)
peano_1_4 _ = False

peano_2_2 :: [Expr] -> Bool
peano_2_2 [a, b, c] = a `eqIgT` (succPeano . succPeano $ zeroPeano) && b `eqIgT` (succPeano . succPeano $ zeroPeano)
                   && c `eqIgT` (succPeano . succPeano . succPeano . succPeano $ zeroPeano)
peano_2_2 _ = False

peano_3_1 :: [Expr] -> Bool
peano_3_1 [a, b, c] = peano_1_3 [b, a, c]
peano_3_1 _ = False

peano_4_0 :: [Expr] -> Bool
peano_4_0 [a, b, c] = peano_0_4 [b, a, c]
peano_4_0 _ = False

peano_4_1 :: [Expr] -> Bool
peano_4_1 [a, b, c] = peano_1_4 [b, a, c]
peano_4_1 _ = False

peano_4_out :: [Expr] -> Bool
peano_4_out [_, _, a] = a `eqIgT` (succPeano . succPeano . succPeano . succPeano $ zeroPeano)
peano_4_out _ = False

peano_1_4_5 :: [Expr] -> Bool
peano_1_4_5 [a, b, c] = a `eqIgT` (succPeano $ zeroPeano) && b `eqIgT` (succPeano . succPeano . succPeano . succPeano $ zeroPeano)
                      && c `eqIgT` (succPeano . succPeano . succPeano . succPeano . succPeano $ zeroPeano)
peano_1_4_5 _ = False

peano_4_1_5 :: [Expr] -> Bool
peano_4_1_5 [a, b, c] = peano_1_4_5 [b, a, c]
peano_4_1_5 _ = False