2011-10-25 8 views
1

リストのペアの変数をリストに代入できる関数を書く必要があります。例(subsitute-var '((p #t) (Q #f)) '(P and Q or Q))スキーム

のために私はいくつかのコード

(define substitute 
    (lambda (A B list)  
    (cond  
    ((null? list) '())  
    ((list? (car list)) 
     (cons (substitute A B (car list)) (substitute A B (cdr list)))) 
    ((eq? (car list) A) (cons B (substitute A B (cdr list))))  
    (else  
     (cons (car list) (substitute A B (cdr list))))))) 

(define substitute-var 
    (lambda (list var) 
    (cond 
    ((null? list) '()) 
    ((null? var) '()) 
    ((substitute (caar var) (car (cdr (car var))) list))  
     (substitute-var list (cdr var))))) 

を書いてきたが、物事はそれが唯一の最初のペア(p #t)を代用し、同じようなリストの残りの部分を残していることです。私はsubstitute-varを再帰的に呼び出そうとしますが、それも機能しません。私は助けが必要です。私はあなたが得たと思う私はあなたに

+0

また、このsubstitute-var関数の結果は次のようになります(subsitute-var '((p #t)(Q #f))'(PとQまたはQ))=>(#tと#fまたは#f) – Daniel

+0

'list'の代わりの引数を呼ぶのは残念です。その理由は、 'list'は組み込み関数であるからです。私はそれをxsなどと呼ぶことをお勧めします。 – soegaard

答えて

1

に感謝助けてください、あなたのvar

1

これを試してみてください混ざっlist:今

(define (substitute-var var lst) 
    (if (or (null? var) (null? lst)) 
     '() 
     (substitute (car var) (cadr var) lst))) 

(define (substitute a b lst) 
    (cond ((null? lst) '()) 
     ((eq? (car lst) (car a)) 
     (cons (cadr a) (substitute a b (cdr lst)))) 
     ((eq? (car lst) (car b)) 
     (cons (cadr b) (substitute a b (cdr lst)))) 
     (else (cons (car lst) (substitute a b (cdr lst)))))) 

、あなたの例で試験したとき:

(substitute-var '((P #t) (Q #f)) '(P and Q or Q)) 

手順期待される答えを返します。

(#t and #f or #f) 
+0

ご協力いただきありがとうございます – Daniel