個人的なSchemeプログラム文書


;; Scheme Examples
;; This Scheme program is for DrScheme
; Square x
(define (square x) (* x x))
;A function g2
(define (g2 x y)
  (cond ((= y 0) 1)
        ((= y 1) x)
        ((= y 2) (* x x))
        (else 0)))
; Factor of x
(define (factor x)
  (if (= x 0) 1 (* x (factor (- x 1)))))
; Check odd or even of x
(define (oe x)
  (if (= x 0) 0 (if (= (oe (- x 1)) 0) 1 0)))
; Get greater common divisor of x and y
(define (gcd2 x y)
  (if (= y 0) x (gcd2 y (remainder x y))))
; Car of nth position
(define (nth-car n l)
    (cond ((null? l) '())
          ((<= n 0) '())
          ((= n 1) (car l))
          (#t (nth-car (- n 1) (cdr l)))))

; Get list length
(define (listlen-iter l n)
    (if (null? l) n (listlen-iter (cdr l) (+ n 1))))
(define (listlen l)
  (listlen-iter l 0))

; Construct list backward from l1 to l2
(define (cons-bw l1 l2)
  (if (null? l1) l2
      (cons-bw (cdr l1) (cons (car l1) l2))))

; Sort symbol list
(define (sinsert-iter sym src dest)
  (if (null? src) (reverse (cons sym dest))
      (if (string>? (symbol->string sym) (symbol->string (car src)))
          (sinsert-iter sym (cdr src) (cons (car src) dest))
          (cons-bw dest (cons sym src)))))
(define (sinsert sym lst)
  (sinsert-iter sym lst (list)))
(define (sisort-1 src dest)
  (if (null? src) dest
      (sisort-1 (cdr src) (sinsert (car src) dest))))
(define (sisort lst)
  (sisort-1 lst (list)))

; Insert value to appropriate position
(define (insert-iter a src dest)
  (if (null? src) (reverse (cons a dest))
      (if (> a (car src))
          (insert-iter a (cdr src) (cons (car src) dest))
          (cons-bw dest (cons a src)))))
(define (insert a lst)
  (insert-iter a lst (list)))

; Sort list
(define (isort-1 src dest)
  (if (null? src) dest
      (isort-1 (cdr src) (insert (car src) dest))))
(define (isort lst)
  (isort-1 lst (list)))

; Find max and min from list
(define (find-max-min src max min)
  (if (null? src) (list max min)
      (find-max-min (cdr src)
              (if (< max (car src)) (car src) max)
              (if (> min (car src)) (car src) min))))
(define (max-min src)
  (find-max-min src (car src) (car src)))

; Reverse list
(define (reverse-1-iter src dest)
  (if (null? src) dest
      (reverse-1-iter (cdr src) (cons (car src) dest))))
(define (reverse-1 lst)
  (reverse-1-iter lst (list)))

; Recursive reverser
(define (reverse*-iter src dest)
  (if (null? src) dest
      (reverse*-iter (cdr src) (cons 
                                (if (list? (car src))
                                    (reverse* (car src))
                                    (car src))
                                dest))))
(define (reverse* lst)
  (reverse*-iter lst (list)))

; Leaves
(define (leaves-iter src dest)
  (if (null? src) dest
      (leaves-iter (cdr src) (if (list? (car src))
                                  (leaves-iter (car src) dest)
                                  (cons (car src) dest)))))
(define (leaves lst)
  (reverse (leaves-iter lst (list))))

; A set
; Is x element of P?
(define (element? x P)
  (cond ((null? P) #f)
        ((equal? x (car P)) #t)
        (else (element? x (cdr P)))))
; Get intersection set of P and Q
(define (intersection-set P Q)
  (cond ((or (null? P) (null? Q)) '())
        ((element? (car P) Q) (cons 
                               (car P)
                               (intersection-set (cdr P) Q)))
        (else (intersection-set (cdr P) Q))))
; Get union set of P and Q
(define (union-set P Q)
  (cond ((null? P) Q)
        ((null? Q) P)
        ((element? (car P) Q) (union-set (cdr P) Q))
        (else (cons (car P) (union-set (cdr P) Q)))))
; Delete duplicated from P
(define (delete-duplicates P)
  (cond ((null? P) '())
        ((element? (car P) (cdr P)) (delete-duplicates (cdr P)))
        (else (cons (car P) (delete-duplicates (cdr P))))))
; Is P subset of Q
(define (subset? P Q)
  (cond ((null? P) #f)
        ((element? (car P) Q) 
         (if (null? (cdr P)) #t (subset? (cdr P) Q)))
        (else #f)))
; Get difference set of P and Q
(define (difference-set P Q)
  (cond ((null? Q) P)
        ((null? P) '())
        ((element? (car P) Q) (difference-set (cdr P) Q))
        (else (cons (car P) (difference-set (cdr P) Q)))))

; Formula expansion
; Symbol exp1
(define (exp1 x y)
  (if (null? y) '() (cons (list x (car y)) (exp1 x (cdr y)))))
; Symbol exp2
(define (exp2 x y)
  (if (null? x) '() (append (exp1 (car x) y) (exp2 (cdr x) y))))
; Symbol exp3
(define (exp3 x y)
  (if (null? y) '() (cons (append x (car y)) (exp3 x (cdr y)))))
; Symbol exp4
(define (exp4 x y)
  (if (null? x) '() (append (exp3 (car x) y) (exp4 (cdr x) y))))
; Symbol exp5
(define (exp5 x)
  (cond ((null? x) '())
        ((symbol? x) (list (list x)))
        (#t                            ;(list? x)
         (append (if (list? x) 
                               (exp6 (car x)) 
                               (exp5 (car x)))
                               (exp5 (cdr x))))))
; Symbol exp6
(define (exp6 x)
  (cond ((null? x) (list (list 1)))
        ((symbol? x) (list (list x)))
        (#t                            ;(list? x)
         (if (null? (cdr x)) 
             (exp5 (car x))
             (exp4 (exp5 (car x)) (exp6 (cdr x)))))))
; exp10
(define (exp-10-sub l s n)
  (if (or (and (= (remainder n 2) 1)
               (eq? s '*))
          (and (= (remainder n 2) 0)
               (eq? s '+)))
      (list (exp-10-sub l s (+ n 1)))
      (if (null? l) '()
          (if (list? (car l))
              (if (or (eq? (car (car l)) '*)
                      (eq? (car (car l)) '+)) 
                  (cons
                   (exp-10-sub (cdr (car l)) (car (car l)) (+ n 1))
                   (exp-10-sub (cdr l) s n))
                  (cons 
                   (exp-10-sub (car (car l)) s n) 
                   (exp-10-sub (cdr (car l)) s n)))
              (cons (car l) (exp-10-sub (cdr l) s n))))))
(define (exp-10 l)
  (cond ((null? l) '())
        ((list? l) (exp-10-sub (cdr l) (car l) 1))
        (else '())))
;exp11
(define (exp-11-sub-sub l n)
  (cond ((null? l) '())
        ((list? (car l)) (cons 
                          (if (null? (cdr (car l))) (car (car l))
                          (exp-11-sub (car l) (+ n 1)))
                          (exp-11-sub-sub (cdr l) n)))
        (else (cons (car l) (exp-11-sub-sub (cdr l) n)))))
;  (exp-11-sub (car l)
;  (exp-11-sub-sub (cdr l))
(define (exp-11-sub l n)
  (if (null? (cdr l))
      l
      (cons (if (= (remainder n 2) 1) '+ '*) (exp-11-sub-sub l n))))
(define (exp-11 l)
  (cond ((null? l) '())
        ((list? l) (exp-11-sub l 1))
        (else '())))
(define (expander exp)
	  (exp-11 (exp5 (exp-10 exp))))