def test_swap(self): term = parse( f"((lambda x (pair (snd x) (fst x))) (pair (lambda x x) {K}))") swap_type = parse_type("(* (-> a (-> b a)) (-> a a))") normal_form = normalise(swap_type, term) self.assertEqual(str(normal_form), "(pair (lambda a (lambda b a)) (lambda c c))")
def test_i(self): term = generate(parse_type("(-> a a)")) self.assertEqual(str(term), "(lambda a a)")
def test_composition(self): term = generate(parse_type( "(-> (-> a b) (-> (-> b c) (-> a c)))")) self.assertEqual( str(term), "(lambda a (lambda b (lambda c (b (a c)))))")
def test_product_associativity(self): term = generate(parse_type("(-> (* a (* b c)) (* (* a b) c))")) self.assertEqual( str(term), "(lambda a (pair (pair (fst a) (fst (snd a))) (snd (snd a))))")
def test_currying(self): term = generate(parse_type( "(-> (-> (* a b) c) (-> a (-> b c)))")) self.assertEqual( str(term), "(lambda a (lambda b (lambda c (a (pair b c)))))")
def test_swap(self): term = generate(parse_type("(-> (* a b) (* b a))")) self.assertEqual(str(term), "(lambda a (pair (snd a) (fst a)))")
def test_s(self): term = generate(parse_type( "(-> (-> a (-> b c)) (-> (-> a b) (-> a c)))")) self.assertEqual( str(term), "(lambda a (lambda b (lambda c ((a c) (b c)))))")
def test_eta_long(self): term = parse(SKK) a_to_b_squared = parse_type("(-> (-> a b) (-> a b))") normal_form = normalise(a_to_b_squared, term) self.assertEqual(str(normal_form), "(lambda a (lambda b (a b)))")
def test_skk(self): term = parse(SKK) a_to_a = parse_type("(-> a a)") normal_form = normalise(a_to_a, term) self.assertEqual(str(normal_form), "(lambda a a)")