Extend LOGIK with the following features:

1) Arithmetic constructs for terms: t1 * t2, t1 + t2, t1 - t2

2) List constructs: [t1,t2,...,tn], and [h|t] for patterns

3) Boolean predicates: t1 <= t2, t1 > t2

4) Equality test/assignment predicate: t1 is t2.  Here t2 is evaluated
to a value (i.e., no variables) and then its value is unified with t1.

5) Write predicate: write(t).  Here t is expected to evaluate to a string
or an integer.

As usual, lots of tests are available to test your semantics.  However,
due to some pretty printing issues, it is quite likely that the .out files
will change.  So do not trust blindly the output of ktest, check the outputs
manually, too, and ignore the pretty printing.
