2011-10-25 5 views
1

Je dois écrire la fonction qui peut substituer les variables dans les paires de liste dans la liste. par exemple (subsitute-var '((p #t) (Q #f)) '(P and Q or Q))besoin d'aide pour la fonction de remplacement dans le schéma

J'ai écrit un code

(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))))) 

mais les choses est qu'il remplace uniquement la première paire (p #t) et a quitté le reste de la liste comme le même. J'essaie d'appeler substitute-var récursivement, mais cela ne fonctionne pas non plus. j'ai donc besoin d'aide. S'il vous plaît aidez-moi vous remercier

+0

et aussi le résultat de cette fonction subst-var devrait être comme (subsitute-var '((p # t) (Q #f))' (P et Q ou Q)) => (#t et #f ou #f) – Daniel

+0

Il est fâcheux d'appeler l'argument de substitut de 'list'. La raison en est que 'list' est une fonction intégrée. Je suggère l'a appelé, disons, xs, ou similaire. – soegaard

Répondre

1

Je pense que vous avez obtenu votre var et list mélangé

1

Essayez ceci:

(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)))))) 

Maintenant, lorsqu'il est testé avec votre exemple:

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

La procédure renvoie la réponse attendue:

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

merci pour votre aide – Daniel

Questions connexes