1 Hints for list_equal.
3 *       If left is [], what does right have to be for left and right to be equal? (Come on, it's not too hard, you can figure it out.)
5 *       Suppose on the other hand that left has head left_hd and tail left_tl.
7         <OL type=a>
8         <LI>If right is then [], are left and right equal?
9         <LI>If right isn't [], and its head isn't equal to left_hd, are left and right equal?
10         <LI>If right isn't [] and its head *is* equal to left_hd, what else has to be the case for left and right to be equal?
11         </OL>
13 *       Can you now write a recursive definition of the list_equal function?
14 What's your base case?
17 <!--
18 let list_equal =
19     \left right. left
20                 ; here's our f
21                 (\hd sofar.
22                     ; deconstruct our sofar-pair
23                     sofar (\might_be_equal right_tail.
24                         ; our new sofar
25                         make_pair
26                         (and (and might_be_equal (not (isempty right_tail))) (eq? hd (head right_tail)))
27                         (tail right_tail)
28                     ))
29                 ; here's our z
30                 ; we pass along the fold a pair
31                 ; (might_for_all_i_know_still_be_equal?, tail_of_reversed_right)
32                 ; when left is empty, the lists are equal if right is empty
33                 (make_pair
34                     true ; for all we know so far, they might still be equal
35                     (reverse right)
36                 )
37                 ; when fold is finished, check sofar-pair
38                 (\might_be_equal right_tail. and might_be_equal (isempty right_tail))
39 -->
41 <!--
42 eql [] l2        = empty l2
43 eql (l1h:l1t) l2 = and (not (empty l2))
44                        (l1h == head l2)
45                        (eql l1t (tail l2))
47 Rearangement:
49 eql []        = \l2 -> empty l2
50 eql (l1h:l1t) = let prev = eql l1t
51                 in \l2 -> and (not (empty l2))
52                               (l1h == head l2)
53                               (prev (tail l2))
55 Now it fits the pattern of foldr
57 let list_equal = \lst. lst (\hd sofar. \lst. and (and (not (isempty lst)) (eq hd (head lst))) (sofar (tail lst))) isempty
59 -->