! form.ax.txt - utility spec ax for "form" predicates ! These predicates deal with the structure of expressions, not really content. !---+----|----+----|----+----|----+----|----+----|----+----|----+----|----+----8 !/ ===== sets ===== ( ) expr - element is an arbitary expression (which doesn't constrain an expr var) seq - element is a sequence - note that there can be no "atom" predicate in basic axiomatic language singleton - element is sequence of one element pair - element is sequence of two elements twins - element is sequence of two of the same element triple - element is sequence of three elements - predicates for larger tuples may incorporate a decimal num in the pred name ===== binrel - binary relations ===== ( ) == - the two arguments are identical in - 1st arg is element in 2nd arg sequence head (first) - 1st arg is head element of 2nd arg sequence last - 2nd arg is last element of 1st arg sequence tail - 2nd arg is tail of 1st arg sequence (everything but head) ftail (front_tail) - 1st argument is everything but last elem of 2nd arg seq prefix - 1st arg is prefix of 2nd arg sequence suffix - 2nd arg is suffix of 1st arg sequence substr - 1st arg is substring of 2nd arg sequence subseq - 1st arg is ordered subset of 2nd arg seq elems (may have dups) rotate - swap prefix/suffix of a sequence reverse - 2nd arg sequence is reverse of 1st arg sequence =len - both sequence arguments have the same length ) === also includes ternary relations === k-tuples - get all k-tuples from arg 2 element sequence, with k = arg 1 len append1 - append one element to end of a sequence prepend1 - prepend one element to front of a sequence concat - concatenate two sequences insert - insert expr at arbitrary position in sequence distr - distribute arg 1 seq as prepended heads of arg 2 seqs !\ ! ===== sets ===== ! ( ) ! expr - element is an arbitary expression (which doesn't constrain an expr var) (expr %). ! seq - element is a sequence (seq ($)). ! - note that there can be no atom predicate in basic axiomatic language ! singleton - element is sequence of one element (singleton (%)). ! pair - element is sequence of two elements (pair (%1 %2)). ! twins - element is sequence of two of the same element (twins (% %)). ! triple - element is sequence of three elements (triple (%1 %2 %3)). ! - predicates for larger tuples may incorporate a decimal number in the name ! - =len gives tuples of specified length, with length given by other arg ! ===== binrel - binary relations ===== ! ( ) ! == (id) - the two arguments are identical (== % %). ! in (member) - 1st arg is element in 2nd arg sequence (in % ($1 % $2)). ! head (first) - 1st arg is head element of 2nd arg sequence (head % (% $)). ! last - 2nd arg is last element of 1st arg sequence (last ($ %) %). ! - arg order? - this is a nice complement of head pred ! tail - 2nd arg is tail of 1st arg sequence (everything but head) (tail (% $) ($)). ! ftail (front_tail) - 1st argument is everything but last elem of 2nd arg seq ! -- better name needed! (ftail ($) ($ %)). ! prefix - 1st arg is prefix of 2nd arg sequence (prefix ($p) ($p $)). ! suffix - 2nd arg is suffix of 1st arg sequence (suffix ($ $s) ($s)). ! substr - 1st arg is (continguous) substring of 2nd arg sequence (substr ($) ($1 $ $2)). ! This can be used to get successive ordered pairs from a sequence ! subseq - 1st arg sequence is ordered subset of 2nd arg seq elems (subseq () ()). (valid (subseq ($sub) (% $seq)) ! some arg 2 elems omitted from arg 1 (subseq (% $sub) (% $seq)))< (subseq ($sub) ($seq)). ! rotate - swap prefix/suffix of a sequence (rotate ($1 $2) ($2 $1)). ! reverse - 2nd arg sequence is reverse of 1st arg sequence (reverse () ()). (reverse ($ %) (% $r))< (reverse ($) ($r)). ! =len - both sequence arguments have the same length (=len () ()). (=len (%1 $1) (%2 $2))< (=len ($1) ($2)). ! ) ! k-tuples - get all k-tuples from arg 2 elem seq, with k = arg 1 len ! - tuples are ordered by element sequence order (k-tuples () ($e) (())). ! only 1 0-len tuple for any elem seq (k-tuples ($l) ($e) (($e)))< ! only 1 k-tuple from k-elem seqtup (=len ($l) ($e)). ! -- needed?? (k-tuples %l %e ())< ! no k-tuples longer than elem seq (>len %l %e). (k-tuples (%l $l) (%e $e) ($etups $tups))< ! %e k-tups + $e k-tups (k-tuples ($l) ($e) ($k--tups)), ! get k-- tuples from $e elems ((1* prepend) %e ($k--tups) ($etups)), ! prepend %e to get %e k-tups (k-tuples (%l $l) ($e) ($tups)). ! get k-tups without leading %e ! - Note that tuples have element order !/ example axiom instances: (k-tuples () () (())). (k-tuples () (%e0) (())). (k-tuples () (%e1 %e0) (())). (k-tuples () (%e2 %e1 %e0) (())). ... (k-tuples () () (())). (k-tuples (%l0) (%e0) ((%e0))). (k-tuples (%l1 %l0) (%e1 %e0) ((%e1 %e0))). (k-tuples (%l2 %l1 %l0) (%e2 %e1 %e0) ((%e2 %e1 %e0))) ... (k-tuples (%l0) () ()). (k-tuples (%l1 %l0) () ()). (k-tuples (%l1 %l0) (%e0) ()). ... (k-tuples (%l0) (%e0) ((%e0)))< - $etups = '(%e0)' $tups = '' (k-tuples () () (()), ((1* prepend) %e0 (()) ((%e0))), (k-tuples (%l0) () (())). (k-tuples (%l0) (%e1 %e0) ((%e1) (%e0)))< - $etups = '(%e1)' 2tups = '(%e0)' (k-tuples () (%e0) (())), ((1* prepend) %e1 (()) ((%e1))), (k-tuples (%l0) (%e0) ((%e0%))). (k-tuples (%l0) (%e2 %e1 %e0) ((%e2) (%e1) (%e0)))< - $etups = '(%e2)' $tups = '(%e1) (%e0)' (k-tuples () (%e1 %e0) (())), ((1* prepend) %e2 (()) ((%e2))), (k-tuples (%l0) (%e1 %e0) ((%e1) (%e0))). ... (k-tuples (%l1 %l0) (%e1 %e0) ((%e1 %e0)))< - $etups = '(%e1 %e0)' $tups = '' (k-tuples (%l0) (%e0) ((%e0))), ((1* prepend) %e1 ((%e0)) ((%e1 %e0))), (k-tuples (%l1 %l0) (%e0) ()). (k-tuples (%l1 %l0) (%e2 %e1 %e0) ((%e2 %e1) (%e2 %e0) (%e1 %e0)))< - $etups = '(%e2 %e1) (%e2 %e0)' $tups = '(%e1 %e0)' (k-tuples (%l0) (%e1 %e0) ((%e1) (%e0))), ((1* prepend) %e2 ((%e1) (%e0)) ((%e2 %e1) (%e2 %e0))), (k-tuples (%l1 %l0) (%e1 %e0) ((%e1 %e0))). (k-tuples (%l1 %l0) (%e2 %e1 %e0) ((%e3 %e2) (%e3 %e1) (%e3 %e0) - ($etups (%e2 %e1) (%e2 %e0) (%e1 %e0)))< $tups) (k-tuples (%l0) (%e2 %e1 %e0) ((%e2) (%e1) (%e0))), ((1* prepend) %e3 ((%e2) (%e1) (%e0)) ((%e3 %e2) (%e3 %e1) (%e3 %e0))), (k-tuples (%l1 %l0) (%e2 %e1 %e0) ((%e2 %e1) (%e2 %e0) (%e1 %e0))). ... !\ ! append1 - append one element to end of a sequence (append1 ($) % ($ %)). ! prepend1 - prepend one element to front of a sequence (prepend1 % ($) (% $)). ! concat - concatenate two sequences (concat ($1) ($2) ($1 $2)) ! insert - insert expr at arbitrary position in sequence (insert %x ($1 $2) ($1 %x $2)). ! distr - distribute arg 1 seq as prepended heads of arg 2 seqs (distr () () ()). (distr (%h $h) (($) $seqs) ((%h $) $seqs'))< (distr ($h) ($seqs) ($seqs')).