{

`Oplossingen reeks 5`

`Oefening 1 en 2` 

`paren voorgesteld als functies`
pair(first, second) : koppel(g) : g(first, second);
first(pair): pair(true);
second(pair): pair(false);

sumPair(pair): first(pair) + second(pair);
s1: sumPair(pair(1,2));

`paren voorgesteld als tabellen`
pair(first, second) := [first, second];
first(pair):=  pair[1];
second(pair):= pair[2];

`bestaande paar-bewerkingen blijven geldig`
s2: sumPair(pair(1,2));
s1=s2;

`Oefening 3`
is_pair(x) : is_table(x) & (size(x)=2);
is_atomic(x) : !is_pair(x);


empty_list : void;
is_empty_list : is_void;

`Oefening 4`
list@elementen : {
	l : empty_list;
	for(i:size(elementen), i > 0, i:=i-1, l := pair(elementen[i], l));
	l
};

`Oefening 5`
list_length(l) : if(is_empty_list(l), 0, 1 + list_length(second(l)));

list_length(list(1,2,3)); 

`Oefening 6`
append(l1, l2) : if(is_empty_list(l1), l2, pair(first(l1), append(second(l1), l2)));

append(list(1,2,3), list(4,5));

`Oefening 7`
map(f,l) : if(is_empty_list(l), l,  pair(f(first(l)), map(f, second(l))));

inc(x) : x+1;

map(inc, list(1,2,3));


`Oefening 8`
filter(test, l) : if(is_empty_list(l), l,
if(test(first(l)),
   pair(first(l), filter(test, second(l))),
   filter(test, second(l))));

even(x) : x \\ 2 = 0;
filter(even, list(1,2,3,4));

`Oefening 9`
foldr(op, ini, lst) : if(is_empty_list(lst), ini, op(first(lst), foldr(op, ini, (second(lst)))));
foldr(+,0,list(1,2,3));

foldl(op, ini, lst) : if(is_empty_list(lst), ini, op(foldl(op, ini, (second(lst))), first(lst)));
foldl(+,0,list(1,2,3));

`Oefening 10`
copy(l) : foldr(pair, empty_list, l);

foldrf(g(x,y),ini,l) : foldr(g,ini,l);
foldlf(g(x,y),ini,l) : foldl(g,ini,l);

map(f, l) := foldrf(pair(f(x),y), empty_list, l);
map(inc, list(1,2,3));

`Oefening 11`

zip(l1,l2,null,op) : 
if(is_empty_list(l1),
   if(is_empty_list(l2),
      empty_list,
      pair(op(null,first(l2)),zip(l1,second(l2),null,op))),
   if(is_empty_list(l2),
      pair(op(first(l1),null),zip(second(l1),l2,null,op)),
      pair(op(first(l1),first(l2)),zip(second(l1),second(l2),null,op))));

zip(l1,l2,null,op) : { 
 f(l) : if(is_empty_list(l), null, first(l));
 s(l) : if(is_empty_list(l), l, second(l));
 zip(l1,l2) : if(is_empty_list(l1) & is_empty_list(l2), empty_list, pair(op(f(l1), f(l2)), zip(s(l1),s(l2))));
 zip(l1,l2)};
	
zip(list(1,2,3,4),list(3,4),1,+);

`Oefening 12`
pair(first, second()) := [first, second];
first(p) :=  p[1];
second(p) := { f: p[2]; f()};

`Oefening 13`
ones : void;
ones := pair(1, ones);

`ones() : pair(1, ones())`

first(ones);
first(second(second(second(ones))));

nth(l,n) : if(n=1, first(l), nth(second(l), n-1));
nth(ones,100) = 1;

`Oefening 14`

integers_from(n) : pair(n, integers_from(1 + n));

nth(integers_from(1), 5);

`Oefening 15`

sum_streams(s1,s2) : zip(s1,s2,0,+);
nth(sum_streams(integers_from(1), integers_from(2)),3)

`Extraatje(enkel uitproberen in MacPico!)`


`filterfp(test(x), l) : filter(test, l);`
`sieve(s) : pair(first(s), sieve(filterfp(!(x \\ first(s) = 0),second(s))));`
`primes : sieve(integers_from(2));`
`nth(primes, 51)`

}