(define (left-child tree) (cadr tree)) (define (left-child-name tree) (car (left-child tree))) (define (right-child tree) (caddr tree)) (define (right-child-name tree) (car (right-child tree))) (define (cur-name tree) (car tree)) (define (to-string phon-tree node-nbr child next-nbr) (let ((this-name (string-append "node" (number->string node-nbr))) (child-name (string-append "node" (number->string next-nbr)))) (string-append child-name "[label=\"" (cur-name child) "\"];" this-name "--" child-name ";\n" (to-dot-main child next-nbr)))) (define (to-dot-main phon-tree node-nbr) (let* ((this-name (string-append (number->string node-nbr) "node"))) (if (null? (left-child phon-tree)) "" (let ((x (* 2 (+ 1 node-nbr))) (y (* 2 (+ 2 node-nbr)))) (string-append (to-string phon-tree node-nbr (left-child phon-tree) x) (to-string phon-tree node-nbr (right-child phon-tree) y)))))) (define (to-dot phon-tree) (if (null? phon-tree) "\n" (string-append "graph{\n" "node[shape=plaintext];\n" "graph[bgcolor=\"transparent\"];\n" "node1[label=\"" (cur-name phon-tree) "\"];\n" (to-dot-main phon-tree 1) "}"))) (define vowel-tree '("[vowel]" ("[back]" ("[tense]" () ()) ("{tense}" () ())) ("{back}" ("[rnd]" ("[tense]" () ()) ("{tense}" ("[high]" ()) ("{high}" ()))) ("{rnd}" ("[tense]" ("[high]" () ()) ("{high}" () ())) ("{tense}" ("[low]" () ()) ("{low}" () ())))))) (define vowel2-tree '("[vowel]" ("[back]" ("[tense]" ("[high]" () ()) ("{high}" () ())) ("{tense}" ("[high]" () ()) ("{high}" () ()))) ("{back}" ("[tense]" ("[high]" () ()) ("{high}" () ())) ("{tense}" ("[high]" () ()) ("{high}" () ()))))) (define cons-tree '("[cons]" ("[son]" ("[dor]" ("[high]" () ()) ("{high}" () ())) ("{dor}" ("[cor]" () ()) ("{cor}" () ()))) ("{son}" ("[dor]" ("[voice]" ("[high]" () ()) ("{high}" () ())) ("{voice}" ("[high]" () ()) ("{high}" () ()))) ("{dor}" ("[voice]" ("[cor]" () ()) ("{cor}" () ())) ("{voice}" ("[cor]" () ()) ("{cor}" () ())))))) (display (to-dot cons-tree)) (newline)