;;; .EnTete "Le-Lisp (c) version 15.2" " " "The Le-Lisp Benchmarks (5)"
;;; .EnPied "takl.ll" "%" " "
;;; .SuperTitre "The Le-Lisp Benchmarks (5)"
;;;
;;; .Centre "*****************************************************************"
;;; .Centre " Ce fichier est en lecture seule hors du projet ALE de l'INRIA.  "
;;; .Centre " Il est maintenu par ILOG SA, 2 Avenue Gallie'ni, 94250 Gentilly "
;;; .Centre " (c) Le-Lisp est une marque de'pose'e de l'INRIA                 "
;;; .Centre "*****************************************************************"
;;;
;;; .Centre "$Header: takl.ll,v 1.1 88/10/29 22:11:05 chaillou Exp $"

;;; (5) TAKL -- Like TAK, but without any explicit arithmetic.


(defun check-takl ()
   (check-value '(test-takl 1) '(7 6 5 4 3 2 1)))

(defun meter-takl ()
   (perform-meter '(takl ll-18 ll-12 ll-6) 'takl))

(defun test-takl (n)
   (if (eq n 1)
       (takl ll-18 ll-12 ll-6)
       (repeat n (takl ll-18 ll-12 ll-6))))



(defun listn (n)
   (if (not (= 0 n))
       (cons n (listn (sub1 n))))))

(defvar ll-18 (listn 18))
(defvar ll-12 (listn 12))
(defvar ll-6  (listn 6))

(defun takl (x y z)
   (if (not (shorterp y x))
       z
       (takl (takl (cdr x) y z)
	     (takl (cdr y) z x)
	     (takl (cdr z) x y))))

(defun shorterp  (x y)
   (when y
	 (if x
	     (shorterp (cdr x) (cdr y))
	     t)))