# Author: Paul Fitzpatrick, paulfitz@ai.mit.edu
# Copyright (c) 2003 Paul Fitzpatrick
#
# This file is part of CosmicOS.
#
# CosmicOS is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# CosmicOS is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with CosmicOS; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# MATH introduce numbers (in unary notation)
[hear] (intro (unary 0));
[hear] (intro (unary 1 0));
[hear] (intro (unary 1 1 0));
[hear] (intro (unary 1 1 1 0));
[hear] (intro (unary 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 0));
[hear] (intro (unary 1 1 1 0));
[hear] (intro (unary 1 1 0));
[hear] (intro (unary 1 0));
[hear] (intro (unary 0));
[hear] (intro (unary 0));
[hear] (intro (unary 1 0));
[hear] (intro (unary 1 1 0));
[hear] (intro (unary 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 0));
[hear] (intro (unary 1 0));
[hear] (intro (unary 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 0));
[hear] (intro (unary 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 0));
[hear] (intro (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
# MATH now show equality
[hear] (intro =);
[hear] (= (unary 0) (unary 0));
[hear] (= (unary 1 1 1 1 0) (unary 1 1 1 1 0));
[hear] (= (unary 1 1 1 1 1 1 0) (unary 1 1 1 1 1 1 0));
[hear] (= (unary 1 1 0) (unary 1 1 0));
[hear] (= (unary 1 1 1 0) (unary 1 1 1 0));
# MATH now show other relational operators
[hear] (intro >);
[hear] (> (unary 1 1 1 0) (unary 1 0));
[hear] (> (unary 1 0) (unary 0));
[hear] (> (unary 1 1 1 1 1 1 0) (unary 0));
[hear] (> (unary 1 1 1 1 0) (unary 0));
[hear] (> (unary 1 1 1 1 1 0) (unary 0));
[hear] (> (unary 1 1 1 1 0) (unary 0));
[hear] (> (unary 1 0) (unary 0));
[hear] (> (unary 1 1 1 1 1 1 0) (unary 1 0));
[hear] (> (unary 1 1 1 1 1 1 0) (unary 1 1 0));
[hear] (> (unary 1 1 1 0) (unary 1 0));
[hear] (> (unary 1 1 1 1 1 0) (unary 0));
[hear] (intro <);
[hear] (< (unary 0) (unary 1 1 1 1 1 1 0));
[hear] (< (unary 0) (unary 1 0));
[hear] (< (unary 0) (unary 1 0));
[hear] (< (unary 0) (unary 1 1 0));
[hear] (< (unary 1 0) (unary 1 1 1 0));
[hear] (< (unary 0) (unary 1 1 0));
[hear] (< (unary 1 1 0) (unary 1 1 1 1 0));
[hear] (< (unary 1 1 1 0) (unary 1 1 1 1 1 0));
[hear] (< (unary 0) (unary 1 1 0));
[hear] (< (unary 0) (unary 1 1 1 1 1 0));
[hear] (< (unary 1 1 1 0) (unary 1 1 1 1 1 1 0));
[hear] (< (unary 1 1 0) (unary 1 1 1 0));
[hear] (> (unary 1 1 0) (unary 1 0));
[hear] (> (unary 1 1 1 1 1 0) (unary 1 0));
[hear] (= (unary 1 1 1 0) (unary 1 1 1 0));
[hear] (= (unary 1 1 1 0) (unary 1 1 1 0));
[hear] (> (unary 1 0) (unary 0));
[hear] (< (unary 1 0) (unary 1 1 1 1 0));
[hear] (= (unary 1 1 1 1 0) (unary 1 1 1 1 0));
[hear] (> (unary 1 1 1 0) (unary 1 1 0));
[hear] (= (unary 1 1 1 0) (unary 1 1 1 0));
[hear] (< (unary 1 1 1 0) (unary 1 1 1 1 1 0));
# MATH introduce the NOT logical operator
[hear] (intro not);
[hear] (= (unary 1 0) (unary 1 0));
[hear] (not (< (unary 1 0) (unary 1 0)));
[hear] (not (> (unary 1 0) (unary 1 0)));
[hear] (= (unary 1 1 1 0) (unary 1 1 1 0));
[hear] (not (< (unary 1 1 1 0) (unary 1 1 1 0)));
[hear] (not (> (unary 1 1 1 0) (unary 1 1 1 0)));
[hear] (= (unary 0) (unary 0));
[hear] (not (< (unary 0) (unary 0)));
[hear] (not (> (unary 0) (unary 0)));
[hear] (= (unary 1 1 1 0) (unary 1 1 1 0));
[hear] (not (< (unary 1 1 1 0) (unary 1 1 1 0)));
[hear] (not (> (unary 1 1 1 0) (unary 1 1 1 0)));
[hear] (= (unary 1 0) (unary 1 0));
[hear] (not (< (unary 1 0) (unary 1 0)));
[hear] (not (> (unary 1 0) (unary 1 0)));
[hear] (= (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 0));
[hear] (not (< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (not (> (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (not (= (unary 1 0) (unary 1 1 1 1 0)));
[hear] (< (unary 1 0) (unary 1 1 1 1 0));
[hear] (not (> (unary 1 0) (unary 1 1 1 1 0)));
[hear] (not (= (unary 1 1 0) (unary 1 1 1 1 0)));
[hear] (< (unary 1 1 0) (unary 1 1 1 1 0));
[hear] (not (> (unary 1 1 0) (unary 1 1 1 1 0)));
[hear] (not (= (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 1 0)));
[hear] (< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 1 0));
[hear] (not (> (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 1 0)));
[hear] (not (= (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 1 0)));
[hear] (< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 1 0));
[hear] (not (> (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 1 0)));
[hear] (not (= (unary 1 0) (unary 1 1 1 0)));
[hear] (< (unary 1 0) (unary 1 1 1 0));
[hear] (not (> (unary 1 0) (unary 1 1 1 0)));
[hear] (not (= (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 0)));
[hear] (< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 0));
[hear] (not (> (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 0)));
[hear] (not (= (unary 1 1 1 1 1 0) (unary 1 1 1 1 0)));
[hear] (> (unary 1 1 1 1 1 0) (unary 1 1 1 1 0));
[hear] (not (< (unary 1 1 1 1 1 0) (unary 1 1 1 1 0)));
[hear] (not (= (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (> (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0));
[hear] (not (< (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (not (= (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (> (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0));
[hear] (not (< (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (not (= (unary 1 1 1 0) (unary 1 0)));
[hear] (> (unary 1 1 1 0) (unary 1 0));
[hear] (not (< (unary 1 1 1 0) (unary 1 0)));
[hear] (not (= (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (> (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0));
[hear] (not (< (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (not (= (unary 1 1 1 1 1 1 0) (unary 1 1 1 0)));
[hear] (> (unary 1 1 1 1 1 1 0) (unary 1 1 1 0));
[hear] (not (< (unary 1 1 1 1 1 1 0) (unary 1 1 1 0)));
# MATH introduce the AND logical operator
[hear] (intro and);
[hear] (and (< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 1 0))
(> (unary 1 1 1 1 0) (unary 1 1 1 0)));
[hear] (and (= (unary 1 0) (unary 1 0))
(= (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (and (> (unary 1 1 1 1 0) (unary 1 1 1 0))
(> (unary 1 1 1 1 0) (unary 1 0)));
[hear] (and (< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 0))
(= (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (and (> (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0))
(= (unary 1 1 0) (unary 1 1 0)));
[hear] (and (< (unary 1 1 1 0) (unary 1 1 1 1 1 1 0))
(> (unary 1 1 1 1 1 0) (unary 1 1 1 1 0)));
[hear] (and (= (unary 1 1 0) (unary 1 1 0))
(< (unary 0) (unary 1 1 0)));
[hear] (and (> (unary 1 1 1 1 1 0) (unary 1 1 0))
(= (unary 1 1 0) (unary 1 1 0)));
[hear] (and (< (unary 1 0) (unary 1 1 1 1 0))
(= (unary 1 1 1 1 0) (unary 1 1 1 1 0)));
[hear] (and (< (unary 1 0) (unary 1 1 0))
(= (unary 1 1 0) (unary 1 1 0)));
[hear] (not (and (> (unary 1 1 1 1 0) (unary 1 1 1 0)) (> (unary 0) (unary 1 0))));
[hear] (not
(and (< (unary 1 1 1 0) (unary 1 1 1 1 1 0))
(= (unary 1 1 0) (unary 1 1 1 1 0))));
[hear] (not
(and (< (unary 1 1 1 1 0) (unary 1 1 1 1 1 1 0))
(> (unary 1 0) (unary 1 1 1 1 1 0))));
[hear] (not
(and (< (unary 1 1 1 1 0) (unary 1 1 1 1 1 1 0))
(= (unary 1 1 1 0) (unary 1 1 1 1 1 0))));
[hear] (not (and (= (unary 1 0) (unary 1 0)) (< (unary 1 1 1 1 1 0) (unary 1 1 0))));
[hear] (not (and (> (unary 1 1 0) (unary 1 1 1 0)) (< (unary 1 0) (unary 1 1 1 0))));
[hear] (not
(and (< (unary 1 1 1 1 1 1 0) (unary 1 0))
(> (unary 1 1 1 0) (unary 1 1 0))));
[hear] (not
(and (= (unary 1 1 1 1 1 0) (unary 1 1 1 1 0))
(> (unary 1 1 0) (unary 0))));
[hear] (not
(and (= (unary 1 0) (unary 0))
(> (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0))));
[hear] (not
(and (> (unary 1 1 1 0) (unary 1 1 1 1 1 0))
(< (unary 1 1 1 0) (unary 1 1 1 1 1 1 0))));
[hear] (not
(and (< (unary 1 1 1 1 1 0) (unary 1 1 1 1 0))
(> (unary 1 1 1 1 1 1 0) (unary 1 1 1 1 1 1 0))));
[hear] (not (and (= (unary 1 1 1 1 0) (unary 0)) (> (unary 0) (unary 1 1 1 0))));
[hear] (not
(and (= (unary 1 1 1 1 1 0) (unary 0))
(> (unary 1 1 1 0) (unary 1 1 1 0))));
[hear] (not (and (> (unary 0) (unary 1 1 1 1 0)) (> (unary 1 1 0) (unary 1 1 0))));
[hear] (not (and (= (unary 0) (unary 1 1 1 1 0)) (= (unary 1 1 1 1 1 0) (unary 1 0))));
[hear] (not (and (< (unary 1 1 0) (unary 1 1 1 1 0)) (< (unary 1 1 1 0) (unary 1 0))));
[hear] (and (< (unary 1 1 1 0) (unary 1 1 1 1 1 1 0))
(> (unary 1 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (not
(and (> (unary 1 1 1 1 1 1 0) (unary 1 1 1 0))
(> (unary 1 1 0) (unary 1 1 1 0))));
[hear] (not (and (> (unary 1 0) (unary 0)) (< (unary 1 1 1 0) (unary 1 1 0))));
[hear] (and (< (unary 0) (unary 1 1 0))
(> (unary 1 0) (unary 0)));
[hear] (not (and (= (unary 1 1 1 1 0) (unary 1 0)) (> (unary 0) (unary 1 1 1 0))));
[hear] (not
(and (> (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 0))
(= (unary 1 1 0) (unary 1 1 0))));
[hear] (not (and (= (unary 1 1 0) (unary 1 0)) (> (unary 1 0) (unary 1 1 1 0))));
[hear] (not (and (> (unary 1 1 1 1 0) (unary 1 1 1 1 0)) (= (unary 1 0) (unary 1 0))));
[hear] (not
(and (> (unary 1 1 0) (unary 1 1 0))
(< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 0))));
# MATH introduce the OR logical operator
[hear] (intro or);
[hear] (or (= (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 0))
(> (unary 1 1 1 1 1 1 0) (unary 1 1 1 0)));
[hear] (or (< (unary 1 0) (unary 1 1 0))
(> (unary 1 1 0) (unary 0)));
[hear] (or (> (unary 1 1 1 1 0) (unary 1 0))
(< (unary 1 1 0) (unary 1 1 1 1 0)));
[hear] (or (< (unary 1 0) (unary 1 1 1 1 0))
(> (unary 1 0) (unary 0)));
[hear] (or (< (unary 1 1 1 1 0) (unary 1 1 1 1 1 0))
(= (unary 0) (unary 0)));
[hear] (or (> (unary 1 1 1 1 1 0) (unary 1 1 0))
(= (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (or (> (unary 1 1 1 1 1 0) (unary 1 1 0))
(> (unary 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (or (< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 1 1 0))
(< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 1 1 0)));
[hear] (or (= (unary 0) (unary 0))
(= (unary 1 1 0) (unary 1 1 0)));
[hear] (or (< (unary 0) (unary 1 1 1 0))
(= (unary 0) (unary 0)));
[hear] (or (< (unary 0) (unary 1 1 0))
(= (unary 1 1 1 1 0) (unary 1 1 0)));
[hear] (or (> (unary 1 1 1 0) (unary 1 0))
(= (unary 0) (unary 1 1 0)));
[hear] (or (= (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 0))
(= (unary 1 0) (unary 1 1 1 1 1 0)));
[hear] (or (< (unary 1 1 0) (unary 1 1 1 1 0))
(< (unary 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (or (> (unary 1 1 1 1 1 0) (unary 1 1 1 0))
(> (unary 1 1 0) (unary 1 1 1 1 0)));
[hear] (or (> (unary 0) (unary 1 1 1 1 0))
(= (unary 0) (unary 0)));
[hear] (or (= (unary 1 1 0) (unary 0))
(< (unary 0) (unary 1 1 0)));
[hear] (or (< (unary 1 1 1 1 1 1 0) (unary 1 1 0))
(< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 1 0)));
[hear] (or (= (unary 1 1 0) (unary 0))
(= (unary 0) (unary 0)));
[hear] (or (> (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 0))
(< (unary 1 0) (unary 1 1 0)));
[hear] (not
(or (> (unary 1 0) (unary 1 1 1 1 1 1 0))
(> (unary 1 1 1 1 0) (unary 1 1 1 1 0))));
[hear] (not
(or (> (unary 1 1 0) (unary 1 1 1 1 1 1 0))
(> (unary 1 1 0) (unary 1 1 1 1 1 0))));
[hear] (not (or (> (unary 1 1 1 0) (unary 1 1 1 1 0)) (= (unary 1 0) (unary 0))));
[hear] (not
(or (> (unary 1 1 1 0) (unary 1 1 1 0))
(< (unary 1 1 1 1 1 0) (unary 1 1 1 0))));
[hear] (not (or (= (unary 1 1 1 1 1 0) (unary 1 1 1 1 0)) (> (unary 0) (unary 0))));
[hear] (not (or (> (unary 0) (unary 1 0)) (< (unary 1 1 1 1 1 0) (unary 1 1 0))));
[hear] (not (or (> (unary 1 0) (unary 1 1 1 1 1 1 0)) (< (unary 1 1 0) (unary 0))));
[hear] (or (> (unary 0) (unary 1 1 1 0))
(> (unary 1 1 1 1 0) (unary 1 1 1 0)));
[hear] (or (< (unary 1 1 1 1 0) (unary 0))
(< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 1 1 0)));
[hear] (or (= (unary 1 1 1 0) (unary 1 1 1 0))
(= (unary 1 1 0) (unary 1 1 0)));
[hear] (not
(or (< (unary 1 1 1 1 1 0) (unary 1 1 1 0))
(< (unary 1 1 0) (unary 1 0))));
[hear] (or (> (unary 1 1 1 1 0) (unary 1 0))
(> (unary 1 0) (unary 1 1 1 1 1 1 0)));
[hear] (or (< (unary 1 1 1 1 0) (unary 1 1 1 0))
(= (unary 1 1 1 1 0) (unary 1 1 1 1 0)));
[hear] (not (or (> (unary 0) (unary 0)) (= (unary 1 1 0) (unary 1 1 1 0))));
[hear] (or (> (unary 1 1 1 1 1 0) (unary 1 1 0))
(< (unary 1 1 1 0) (unary 1 0)));
# MATH use equality for truth values
[hear] (= (> (unary 1 1 1 1 0) (unary 1 1 0))
(> (unary 1 1 1 1 1 0) (unary 1 1 1 1 0)));
[hear] (= (= (unary 1 1 0) (unary 1 1 0))
(< (unary 1 1 1 1 0) (unary 1 1 1 1 1 1 1 0)));
[hear] (= (> (unary 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0))
(> (unary 1 1 1 0) (unary 1 0)));
[hear] (= (> (unary 1 1 1 1 1 0) (unary 1 1 1 1 0))
(< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 0)));
[hear] (= (= (unary 1 1 0) (unary 1 1 0)) (< (unary 1 1 1 1 0) (unary 1 1 1 1 1 1 0)));
[hear] (= (= (unary 1 1 1 0) (unary 1 1 0)) (= (unary 1 0) (unary 0)));
[hear] (= (> (unary 0) (unary 1 0)) (< (unary 1 1 1 1 0) (unary 1 0)));
[hear] (= (> (unary 1 0) (unary 1 1 1 1 1 0)) (> (unary 1 1 1 0) (unary 1 1 1 0)));
[hear] (= (> (unary 1 1 0) (unary 1 1 1 1 1 0)) (< (unary 1 0) (unary 0)));
[hear] (= (= (unary 1 1 1 0) (unary 1 1 1 1 0)) (= (unary 0) (unary 1 1 1 1 0)));
[hear] (not
(= (= (unary 1 0) (unary 0)) (< (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 1 0))));
[hear] (not (= (= (unary 1 1 1 1 1 0) (unary 1 1 0)) (= (unary 0) (unary 0))));
[hear] (not
(= (< (unary 1 1 1 1 1 0) (unary 1 1 0))
(= (unary 1 1 1 1 1 0) (unary 1 1 1 1 1 0))));
[hear] (not (= (= (unary 0) (unary 1 0)) (> (unary 1 1 1 1 1 0) (unary 1 1 1 1 0))));
[hear] (not
(= (> (unary 1 0) (unary 1 1 1 1 0)) (< (unary 1 1 1 0) (unary 1 1 1 1 0))));
[hear] (not
(= (> (unary 1 1 1 1 1 1 0) (unary 1 1 1 0))
(= (unary 1 1 1 1 0) (unary 1 0))));
[hear] (not
(= (< (unary 1 1 1 1 0) (unary 1 1 1 1 1 1 0))
(> (unary 1 1 1 0) (unary 1 1 1 1 0))));
[hear] (not (= (< (unary 0) (unary 1 1 0)) (= (unary 1 1 1 1 1 0) (unary 1 1 1 1 0))));
[hear] (not
(= (> (unary 1 1 1 1 1 1 0) (unary 1 1 1 1 0)) (< (unary 1 1 0) (unary 0))));
[hear] (not
(= (< (unary 1 1 1 1 0) (unary 1 1 1 1 1 0)) (= (unary 1 1 1 0) (unary 0))));
[hear] (intro true);
[hear] (intro false);
[hear] (= (true) (= (unary 1 1 1 0) (unary 1 1 1 0)));
[hear] (= (true) (= (unary 0) (unary 0)));
[hear] (= (true) (> (unary 1 1 1 1 1 0) (unary 1 1 0)));
[hear] (= (true) (< (unary 1 1 1 0) (unary 1 1 1 1 0)));
[hear] (= (true) (> (unary 1 1 1 1 1 1 1 1 0) (unary 1 1 1 1 1 0)));
[hear] (= (< (unary 1 0) (unary 1 1 1 1 0)) (true));
[hear] (= (< (unary 1 1 1 0) (unary 1 1 1 1 0)) (true));
[hear] (= (= (unary 1 1 1 0) (unary 1 1 1 0)) (true));
[hear] (= (< (unary 1 1 1 0) (unary 1 1 1 1 0)) (true));
[hear] (= (= (unary 1 1 1 1 0) (unary 1 1 1 1 0)) (true));
[hear] (= (false) (> (unary 1 1 0) (unary 1 1 1 1 1 1 0)));
[hear] (= (false) (= (unary 1 1 0) (unary 1 1 1 1 0)));
[hear] (= (false) (< (unary 1 1 0) (unary 0)));
[hear] (= (false) (> (unary 1 1 1 0) (unary 1 1 1 1 1 1 0)));
[hear] (= (false) (< (unary 1 1 1 1 0) (unary 1 1 1 0)));
[hear] (= (> (unary 1 1 0) (unary 1 1 1 1 1 0)) (false));
[hear] (= (= (unary 1 1 0) (unary 1 0)) (false));
[hear] (= (= (unary 1 1 0) (unary 1 1 1 1 1 0)) (false));
[hear] (= (< (unary 1 1 1 1 1 1 0) (unary 1 1 0)) (false));
[hear] (= (< (unary 1 1 1 0) (unary 1 0)) (false));
[hear] (= (true) (true));
[hear] (= (false) (false));
[hear] (not (= (true) (false)));
[hear] (not (= (false) (true)));
# MATH introduce addition
[hear] (intro +);
[hear] (= (+ (unary 1 1 1 0) (unary 1 1 1 1 0)) (unary 1 1 1 1 1 1 1 0));
[hear] (= (+ (unary 0) (unary 1 1 1 0)) (unary 1 1 1 0));
[hear] (= (+ (unary 0) (unary 1 1 1 0)) (unary 1 1 1 0));
[hear] (= (+ (unary 1 0) (unary 0)) (unary 1 0));
[hear] (= (+ (unary 0) (unary 0)) (unary 0));
[hear] (= (+ (unary 1 0) (unary 1 1 1 0)) (unary 1 1 1 1 0));
[hear] (= (+ (unary 1 0) (unary 0)) (unary 1 0));
[hear] (= (+ (unary 1 0) (unary 0)) (unary 1 0));
[hear] (= (+ (unary 1 1 0) (unary 1 1 1 0)) (unary 1 1 1 1 1 0));
[hear] (= (+ (unary 0) (unary 0)) (unary 0));
# MATH introduce subtraction
[hear] (intro -);
[hear] (= (- (unary 1 1 1 1 1 1 0) (unary 1 1 1 0)) (unary 1 1 1 0));
[hear] (= (- (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 0)) (unary 1 1 1 1 0));
[hear] (= (- (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 1 0)) (unary 1 1 1 0));
[hear] (= (- (unary 1 1 1 1 1 0) (unary 1 1 0)) (unary 1 1 1 0));
[hear] (= (- (unary 1 0) (unary 1 0)) (unary 0));
[hear] (= (- (unary 0) (unary 0)) (unary 0));
[hear] (= (- (unary 1 1 0) (unary 0)) (unary 1 1 0));
[hear] (= (- (unary 1 1 1 1 1 1 1 0) (unary 1 1 1 0)) (unary 1 1 1 1 0));
[hear] (= (- (unary 1 1 1 1 0) (unary 1 1 1 1 0)) (unary 0));
[hear] (= (- (unary 1 1 1 0) (unary 0)) (unary 1 1 1 0));
# MATH introduce multiplication
[hear] (intro *);
[hear] (= (* (unary 0) (unary 0)) (unary 0));
[hear] (= (* (unary 0) (unary 1 0)) (unary 0));
[hear] (= (* (unary 0) (unary 1 1 0)) (unary 0));
[hear] (= (* (unary 0) (unary 1 1 1 0)) (unary 0));
[hear] (= (* (unary 1 0) (unary 0)) (unary 0));
[hear] (= (* (unary 1 0) (unary 1 0)) (unary 1 0));
[hear] (= (* (unary 1 0) (unary 1 1 0)) (unary 1 1 0));
[hear] (= (* (unary 1 0) (unary 1 1 1 0)) (unary 1 1 1 0));
[hear] (= (* (unary 1 1 0) (unary 0)) (unary 0));
[hear] (= (* (unary 1 1 0) (unary 1 0)) (unary 1 1 0));
[hear] (= (* (unary 1 1 0) (unary 1 1 0)) (unary 1 1 1 1 0));
[hear] (= (* (unary 1 1 0) (unary 1 1 1 0)) (unary 1 1 1 1 1 1 0));
[hear] (= (* (unary 1 1 1 0) (unary 0)) (unary 0));
[hear] (= (* (unary 1 1 1 0) (unary 1 0)) (unary 1 1 1 0));
[hear] (= (* (unary 1 1 1 0) (unary 1 1 0)) (unary 1 1 1 1 1 1 0));
[hear] (= (* (unary 1 1 1 0) (unary 1 1 1 0)) (unary 1 1 1 1 1 1 1 1 1 0));
[hear] (= (* (unary 1 1 1 0) (unary 0)) (unary 0));
[hear] (= (* (unary 0) (unary 1 0)) (unary 0));
[hear] (= (* (unary 0) (unary 1 0)) (unary 0));
[hear] (= (* (unary 0) (unary 1 0)) (unary 0));
[hear] (= (* (unary 0) (unary 1 1 0)) (unary 0));
[hear] (= (* (unary 1 1 1 0) (unary 1 0)) (unary 1 1 1 0));
[hear] (= (* (unary 1 1 1 0) (unary 1 1 1 0)) (unary 1 1 1 1 1 1 1 1 1 0));
[hear] (= (* (unary 1 0) (unary 1 1 0)) (unary 1 1 0));
[hear] (= (* (unary 0) (unary 1 0)) (unary 0));
[hear] (= (* (unary 0) (unary 1 1 1 0)) (unary 0));
# MATH introduce a simple form of binary notation
# After this lesson, in the higher-level version of the message,
# will expand decimal to stand for the binary notation given.
[hear] (= (unary 0) (.));
[hear] (= (unary 1 0) (:));
[hear] (= (unary 1 1 0) (:.));
[hear] (= (unary 1 1 1 0) (::));
[hear] (= (unary 1 1 1 1 0) (:..));
[hear] (= (unary 1 1 1 1 1 0) (:.:));
[hear] (= (unary 1 1 1 1 1 1 0) (::.));
[hear] (= (unary 1 1 1 1 1 1 1 0) (:::));
[hear] (= (unary 1 1 1 1 1 1 1 1 0) (:...));
[hear] (= (unary 1 1 1 1 1 1 1 1 1 0) (:..:));
[hear] (= (unary 1 1 1 1 1 1 1 1 1 1 0) (:.:.));
[hear] (= (unary 1 1 1 1 1 1 1 1 1 1 1 0) (:.::));
[hear] (= (unary 1 1 1 1 1 1 1 1 1 1 1 1 0) (::..));
[hear] (= (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 0) (::.:));
[hear] (= (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0) (:::.));
[hear] (= (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0) (::::));
[hear] (= (::.:) (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (= (::) (unary 1 1 1 0));
[hear] (= (::.:) (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (= (:.:) (unary 1 1 1 1 1 0));
[hear] (= (:..:) (unary 1 1 1 1 1 1 1 1 1 0));
[hear] (= (::.:) (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (= (:.:) (unary 1 1 1 1 1 0));
[hear] (= (::::) (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (= (:..:) (unary 1 1 1 1 1 1 1 1 1 0));
[hear] (= (::.) (unary 1 1 1 1 1 1 0));
[hear] (= (:::) (unary 1 1 1 1 1 1 1 0));
[hear] (= (:..) (unary 1 1 1 1 0));
[hear] (= (::.:) (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (= (:::) (unary 1 1 1 1 1 1 1 0));
[hear] (= (:::.) (unary 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0));
[hear] (= (:.:) (unary 1 1 1 1 1 0));
[hear] (= (+ (:.) (:.:)) (:::));
[hear] (= (+ (::.) (::.))
(::..));
[hear] (= (+ (::..) (::))
(::::));
[hear] (= (+ (:.) (::)) (:.:));
[hear] (= (+ (:...) (:...))
(:....));
[hear] (= (+ (::.:) (:::.))
(::.::));
[hear] (= (+ (:::) (:.:.))
(:...:));
[hear] (= (+ (::..) (:.::))
(:.:::));
[hear] (= (* (::.:) (:..:))
(:::.:.:));
[hear] (= (* (::..) (::.:))
(:..:::..));
[hear] (= (* (::..) (:.:.))
(::::...));
[hear] (= (* (::..) (::::))
(:.::.:..));
[hear] (= (* (:) (::.)) (::.));
[hear] (= (* (::.) (:.:.))
(::::..));
[hear] (= (* (:..) (:::.))
(:::...));
[hear] (= (* (::::) (:..:))
(:....:::));
# MATH demonstrate idea of leaving gaps in an expression
# and then filling them in afterwards
# the examples given leave a lot to be desired!
[hear] ((? x (= (+ 2 (x)) 13)) 11);
[hear] ((? x (= (+ 11 (x)) 21)) 10);
[hear] ((? x (= (+ 9 (x)) 11)) 2);
[hear] ((? x (= (+ 12 (x)) 18)) 6);
[hear] ((? x (= (+ 6 (x)) 20)) 14);
[hear] ((? x (= (+ 8 (x)) 10)) 2);
[hear] ((? x (= (+ 11 (x)) 18)) 7);
[hear] ((? x (= (+ 8 (x)) 13)) 5);
[hear] (((? x (? y (= (* (x) (y)) 12))) 6) 2);
[hear] (((? x (? y (= (* (x) (y)) 84))) 12) 7);
[hear] (((? x (? y (= (* (x) (y)) 45))) 15) 3);
[hear] (((? x (? y (= (* (x) (y)) 18))) 3) 6);
[hear] (((? x (? y (= (* (x) (y)) 90))) 15) 6);
[hear] (((? x (? y (= (* (x) (y)) 36))) 3) 12);
[hear] (((? x (? y (= (* (x) (y)) 30))) 2) 15);
[hear] (((? x (? y (= (* (x) (y)) 32))) 8) 4);
[hear] ((((? z (? x (? y (= (* (x) (y)) (z))))) 11) 1)
11);
[hear] ((((? z (? x (? y (= (* (x) (y)) (z))))) 121) 11)
11);
[hear] ((((? z (? x (? y (= (* (x) (y)) (z))))) 156) 12)
13);
[hear] ((((? z (? x (? y (= (* (x) (y)) (z))))) 16) 2)
8);
[hear] ((((? z (? x (? y (= (* (x) (y)) (z))))) 0) 4) 0);
[hear] ((((? z (? x (? y (= (* (x) (y)) (z))))) 108) 12)
9);
[hear] ((((? z (? x (? y (= (* (x) (y)) (z))))) 80) 10)
8);
[hear] ((((? z (? x (? y (= (* (x) (y)) (z))))) 8) 8) 1);
# MATH show some simple function calls
# and show a way to remember functions across statements
[hear] (= ((? square (square 1)) (? x (* (x) (x)))) 1);
[hear] (= ((? square (square 2)) (? x (* (x) (x)))) 4);
[hear] (= ((? square (square 0)) (? x (* (x) (x)))) 0);
[hear] (= ((? square (square 8)) (? x (* (x) (x)))) 64);
[hear] (= ((? square (square 5)) (? x (* (x) (x)))) 25);
[hear] (= ((? square (square 1)) (? x (* (x) (x)))) 1);
[hear] (= ((? square (square 8)) (? x (* (x) (x)))) 64);
[hear] (= ((? square (square 3)) (? x (* (x) (x)))) 9);
[hear] (define square (? x (* (x) (x))));
[hear] (= (square 0) 0);
[hear] (= (square 7) 49);
[hear] (= (square 5) 25);
[hear] (= (square 6) 36);
[hear] (define plusone (? x (+ (x) 1)));
[hear] (= (plusone 7) 8);
[hear] (= (plusone 3) 4);
[hear] (= (plusone 6) 7);
[hear] (= (plusone 9) 10);
# MATH show mechanisms for branching
[hear] (intro if);
[hear] (= (if (true) 8 4) 8);
[hear] (= (if (true) 0 0) 0);
[hear] (= (if (true) 2 7) 2);
[hear] (= (if (true) 9 7) 9);
[hear] (= (if (true) 0 3) 0);
[hear] (= (if (true) 0 4) 0);
[hear] (= (if (true) 4 9) 4);
[hear] (= (if (false) 7 9) 9);
[hear] (= (if (false) 0 8) 8);
[hear] (= (if (false) 6 3) 3);
[hear] (= (if (false) 2 8) 8);
[hear] (= (if (false) 0 3) 3);
[hear] (= (if (true) 8 0) 8);
[hear] (= (if (false) 2 1) 1);
[hear] (= (if (true) 4 7) 4);
[hear] (= (if (false) 2 6) 6);
# MATH some pure lambda calculus definitions - optional
# these definitions are not quite what we want
# since thinking of everything as a function requires headscratching
# it would be better to use these as a parallel means of evaluation
# ... for expressions
[hear] (define pure-if (? x (? y (? z (x (y) (z))))));
[hear] (define pure-true (? y (? z (y))));
[hear] (define pure-false (? y (? z (z))));
[hear] (define pure-cons
(? x (? y (? z (pure-if (z) (x) (y))))));
[hear] (define pure-car (? x (x (pure-true))));
[hear] (define pure-cdr (? x (x (pure-false))));
[hear] (define zero (? f (? x (x))));
[hear] (define one (? f (? x (f (x)))));
[hear] (define two (? f (? x (f (f (x))))));
[hear] (define succ (? n (? f (? x (f ((n (f)) (x)))))));
[hear] (define add (? a (? b ((a (succ)) (b)))));
[hear] (define mult (? a (? b ((a (add (b))) (zero)))));
[hear] (define pred
(? n
(pure-cdr
((n (? p
(pure-cons (succ (pure-car (p))) (pure-car (p)))))
(pure-cons (zero) (zero))))));
[hear] (define is-zero
(? n ((n (? dummy (pure-false)) (pure-true)))));
[hear] (define fixed-point
(? f ((? x (f (x (x)))) (? x (f (x (x)))))));
# .. but for rest of message will assume that define does fixed-point for us
# now build a link between numbers and church number functions
[hear] (define unchurch (? c (c (? x (+ (x) 1)) 0)));
[hear] (= 0 (unchurch (zero)));
[hear] (= 1 (unchurch (one)));
[hear] (= 2 (unchurch (two)));
[hear] (define church
(? x
(if (= 0 (x)) (zero) (succ (church (- (x) 1))))));
# MATH show an example of recursive evaluation
# skipping over a lot of definitions and desugarings
[hear] (define easy-factorial
(? f
(? x (if (> (x) 0) (* (x) (f (f) (- (x) 1))) 1))));
[hear] (define factorial
(? x
(if (> (x) 0) (* (x) (factorial (- (x) 1))) 1)));
[hear] (= (easy-factorial (easy-factorial) 0) 1);
[hear] (= (easy-factorial (easy-factorial) 1) 1);
[hear] (= (easy-factorial (easy-factorial) 2) 2);
[hear] (= (easy-factorial (easy-factorial) 3) 6);
[hear] (= (easy-factorial (easy-factorial) 4) 24);
[hear] (= (easy-factorial (easy-factorial) 5) 120);
[hear] (= (factorial 0) 1);
[hear] (= (factorial 1) 1);
[hear] (= (factorial 2) 2);
[hear] (= (factorial 3) 6);
[hear] (= (factorial 4) 24);
[hear] (= (factorial 5) 120);
# MATH introduce universal quantifier
# really need to link with sets for true correctness
# and the examples here are REALLY sparse, need much more
[hear] (intro forall);
[hear] (< 5 (+ 5 1));
[hear] (< 4 (+ 4 1));
[hear] (< 3 (+ 3 1));
[hear] (< 2 (+ 2 1));
[hear] (< 1 (+ 1 1));
[hear] (< 0 (+ 0 1));
[hear] (forall (? x (< (x) (+ (x) 1))));
[hear] (< 5 (* 5 2));
[hear] (< 4 (* 4 2));
[hear] (< 3 (* 3 2));
[hear] (< 2 (* 2 2));
[hear] (< 1 (* 1 2));
[hear] (not (< 0 (* 0 2)));
[hear] (not (forall (? x (< (x) (* (x) 2)))));
# MATH introduce existential quantifier
# really need to link with sets for true correctness
# and the examples here are REALLY sparse, need much more
[hear] (not (= 5 (* 2 2)));
[hear] (= 4 (* 2 2));
[hear] (not (= 3 (* 2 2)));
[hear] (not (= 2 (* 2 2)));
[hear] (not (= 1 (* 2 2)));
[hear] (not (= 0 (* 2 2)));
[hear] (intro exists);
[hear] (exists (? x (= (x) (* 2 2))));
[hear] (not (= 5 (+ 5 2)));
[hear] (not (= 4 (+ 4 2)));
[hear] (not (= 3 (+ 3 2)));
[hear] (not (= 2 (+ 2 2)));
[hear] (not (= 1 (+ 1 2)));
[hear] (not (= 0 (+ 0 2)));
[hear] (not (exists (? x (= (x) (+ (x) 2)))));
# MATH introduce logical implication
[hear] (intro =>);
[hear] (define => (? x (? y (not (and (x) (not (y)))))));
[hear] (=> (true) (true));
[hear] (not (=> (true) (false)));
[hear] (=> (false) (true));
[hear] (=> (false) (false));
[hear] (forall
(? x
(forall
(? y (=> (=> (x) (y)) (=> (not (y)) (not (x))))))));
# MATH illustrate lists and some list operators
# to make list describable as a function, need to preceed lists
# ... with an argument count
# lists will be written as [1 2 1] = (list 3 1 2 1) after this lesson
# it would be nice to include such syntactic sugar in the message but that
# ... is a fight for another day
# finally, lists keep an explicit record of their length
# this is to avoid the need for using a special 'nil' symbol
# ... which cannot itself be placed in the list.
#
# MISSING - intro to cons, car, cdr
# used to be pure-cons pure-car pure-cdr but changed for better interface to scheme
# also should introduce number? check function
#
[hear] (define list-helper
(? n
(? ret
(if (> (n) 1)
(? x
(list-helper
(- (n) 1)
(? y (? z (ret (+ 1 (y)) (cons (x) (z)))))))
(? x (ret 1 (x)))))));
[hear] (define list
(? n
(if (= (n) 0)
(cons 0 0)
(list-helper (n) (? y (? z (cons (y) (z))))))));
[hear] (define head
(? lst
(if (= (car (lst)) 0)
(undefined)
(if (= (car (lst)) 1)
(cdr (lst))
(car (cdr (lst)))))));
[hear] (define tail
(? lst
(if (= (car (lst)) 0)
(undefined)
(if (= (car (lst)) 1)
(cons 0 0)
(cons (- (car (lst)) 1) (cdr (cdr (lst))))))));
[hear] (define list-length (? lst (car (lst))));
[hear] (define list-ref
(? lst
(? n
(if (= (list-ref (lst)) 0)
(undefined)
(if (= (n) 0)
(head (lst))
(list-ref (tail (lst)) (- (n) 1)))))));
[hear] (define prepend
(? x
(? lst
(if (= (list-length (lst)) 0)
(cons 1 (x))
(cons (+ (list-length (lst)) 1)
(cons (x) (cdr (lst))))))));
[hear] (define list=
(? x
(? y
(if (= (list-length (x)) (list-length (y)))
(if (> (list-length (x)) 0)
(and (= (head (x)) (head (y)))
(list= (tail (x)) (tail (y))))
(true))
(false)))));
[hear] (= (list-length ((list 1) 3)) 1);
[hear] (= (list-length ((list 8) 9 8 0 4 7 3 6 5)) 8);
[hear] (= (list-length ((list 5) 8 6 4 2 5)) 5);
[hear] (= (list-length ((list 9) 5 8 4 3 9 6 1 7 2)) 9);
[hear] (= (list-length ((list 7) 2 4 9 6 5 0 8)) 7);
[hear] (= (head ((list 8) 12 1 4 13 17 3 10 4)) 12);
[hear] (list= (tail ((list 8) 12 1 4 13 17 3 10 4))
((list 7) 1 4 13 17 3 10 4));
[hear] (= (head ((list 9) 6 13 15 4 12 1 0 5 6)) 6);
[hear] (list= (tail ((list 9) 6 13 15 4 12 1 0 5 6))
((list 8) 13 15 4 12 1 0 5 6));
[hear] (= (head ((list 6) 19 4 12 2 15 12)) 19);
[hear] (list= (tail ((list 6) 19 4 12 2 15 12))
((list 5) 4 12 2 15 12));
[hear] (= (head ((list 10) 3 4 4 2 15 3 17 6 11 3)) 3);
[hear] (list= (tail ((list 10) 3 4 4 2 15 3 17 6 11 3))
((list 9) 4 4 2 15 3 17 6 11 3));
[hear] (= (head ((list 2) 15 2)) 15);
[hear] (list= (tail ((list 2) 15 2)) ((list 1) 2));
[hear] (= (head ((list 10) 15 12 17 11 0 12 14 8 17 5))
15);
[hear] (list= (tail ((list 10) 15 12 17 11 0 12 14 8 17 5))
((list 9) 12 17 11 0 12 14 8 17 5));
[hear] (= (head ((list 5) 11 1 10 7 9)) 11);
[hear] (list= (tail ((list 5) 11 1 10 7 9))
((list 4) 1 10 7 9));
[hear] (= (head ((list 3) 19 10 14)) 19);
[hear] (list= (tail ((list 3) 19 10 14))
((list 2) 10 14));
[hear] (= (head ((list 5) 4 2 7 12 18)) 4);
[hear] (list= (tail ((list 5) 4 2 7 12 18))
((list 4) 2 7 12 18));
[hear] (= (head ((list 5) 13 1 0 5 10)) 13);
[hear] (list= (tail ((list 5) 13 1 0 5 10))
((list 4) 1 0 5 10));
[hear] (= (list-ref ((list 1) 9) 0) 9);
[hear] (= (list-ref ((list 10) 4 4 14 0 14 4 17 7 3 17) 0)
4);
[hear] (= (list-ref ((list 8) 10 13 6 14 3 13 9 18) 0)
10);
[hear] (= (list-ref ((list 4) 3 1 0 2) 2) 0);
[hear] (= (list-ref ((list 5) 13 7 18 13 12) 1) 7);
[hear] (= (list-ref ((list 3) 19 16 9) 2) 9);
[hear] (= (list-ref ((list 5) 12 14 5 14 4) 4) 4);
[hear] (= (list-ref ((list 2) 10 17) 1) 17);
[hear] (= (list-ref ((list 4) 1 12 10 18) 3) 18);
[hear] (= (list-ref ((list 8) 17 7 2 4 19 15 4 9) 0) 17);
[hear] (list= ((list 0)) ((list 0)));
[hear] (list= ((list 1) 7) ((list 1) 7));
[hear] (list= ((list 2) 1 19) ((list 2) 1 19));
[hear] (list= ((list 3) 18 1 18) ((list 3) 18 1 18));
[hear] (list= ((list 4) 13 15 10 6)
((list 4) 13 15 10 6));
# this next batch of examples are a bit misleading, should streamline
[hear] (not (list= ((list 0)) ((list 1) 0)));
[hear] (not (list= ((list 0)) ((list 1) 6)));
[hear] (not (list= ((list 1) 9) ((list 2) 6 9)));
[hear] (not (list= ((list 1) 9) ((list 2) 9 7)));
[hear] (not (list= ((list 2) 1 6) ((list 3) 2 1 6)));
[hear] (not (list= ((list 2) 1 6) ((list 3) 1 6 0)));
[hear] (not (list= ((list 3) 10 9 12) ((list 4) 5 10 9 12)));
[hear] (not (list= ((list 3) 10 9 12) ((list 4) 10 9 12 3)));
[hear] (not (list= ((list 4) 17 9 1 0) ((list 5) 4 17 9 1 0)));
[hear] (not (list= ((list 4) 17 9 1 0) ((list 5) 17 9 1 0 4)));
# some helpful functions
[hear] (list= (prepend 12 ((list 0))) ((list 1) 12));
[hear] (list= (prepend 0 ((list 1) 14)) ((list 2) 0 14));
[hear] (list= (prepend 10 ((list 2) 8 19))
((list 3) 10 8 19));
[hear] (list= (prepend 12 ((list 3) 10 2 1))
((list 4) 12 10 2 1));
[hear] (list= (prepend 14 ((list 4) 6 16 14 5))
((list 5) 14 6 16 14 5));
[hear] (list= (prepend 4 ((list 5) 15 2 3 11 8))
((list 6) 4 15 2 3 11 8));
[hear] (list= (prepend 12 ((list 6) 9 2 19 7 2 0))
((list 7) 12 9 2 19 7 2 0));
[hear] (list= (prepend 11 ((list 7) 17 17 2 4 16 5 14))
((list 8) 11 17 17 2 4 16 5 14));
[hear] (define pair (? x (? y ((list 2) (x) (y)))));
[hear] (define first (? lst (head (lst))));
[hear] (define second (? lst (head (tail (lst)))));
[hear] (list= (pair 3 6) ((list 2) 3 6));
[hear] (= (first (pair 3 6)) 3);
[hear] (= (second (pair 3 6)) 6);
[hear] (list= (pair 8 8) ((list 2) 8 8));
[hear] (= (first (pair 8 8)) 8);
[hear] (= (second (pair 8 8)) 8);
[hear] (list= (pair 9 2) ((list 2) 9 2));
[hear] (= (first (pair 9 2)) 9);
[hear] (= (second (pair 9 2)) 2);
[hear] (define list-find-helper
(? lst
(? key
(? fail
(? idx
(if (= (list-length (lst)) 0)
(fail 0)
(if (= (head (lst)) (key))
(idx)
(list-find-helper
(tail (lst))
(key)
(fail)
(+ (idx) 1)))))))));
[hear] (define list-find
(? lst
(? key
(? fail (list-find-helper (lst) (key) (fail) 0)))));
[hear] (define example-fail (? x 100));
[hear] (= (list-find ((list 1) 15) 15 (example-fail)) 0);
[hear] (= (list-find ((list 2) 9 6) 9 (example-fail)) 0);
[hear] (= (list-find
((list 4) 19 7 14 6)
19
(example-fail))
0);
[hear] (= (list-find
((list 8) 10 0 6 9 5 10 2 2)
5
(example-fail))
4);
[hear] (= (list-find ((list 4) 14 5 7 6) 6 (example-fail))
3);
[hear] (= (list-find ((list 1) 2) 2 (example-fail)) 0);
[hear] (= (list-find
((list 7) 19 7 12 4 18 8 7)
4
(example-fail))
3);
[hear] (= (list-find ((list 1) 2) 2 (example-fail)) 0);
[hear] (= (list-find
((list 4) 5 19 13 13)
19
(example-fail))
1);
[hear] (= (list-find
((list 10) 17 14 17 8 6 1 2 12 10 4)
1
(example-fail))
5);
[hear] (= (list-find
((list 4) 15 13 6 17)
14
(example-fail))
100);
[hear] (= (list-find
((list 6) 16 13 10 3 0 19)
2
(example-fail))
100);
[hear] (= (list-find
((list 8) 13 19 4 17 11 9 2 3)
15
(example-fail))
100);
# HACK describe changes to the implicit interpreter to allow new special forms
[hear] (define base-translate (translate));
[hear] (define translate