нужна помощь для замены функции в схеме - PullRequest
1 голос
/ 25 октября 2011

Мне нужно написать функцию, которая может подставлять переменные из пар списка в список. например (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 рекурсивно, но это также не работает. поэтому мне нужна помощь пожалуйста, помогите мне спасибо

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Попробуйте это:

(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)
1 голос
/ 25 октября 2011

Я думаю, вы перепутали var и list

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...