Определите процедуру Scheme (bitAdder x a b) для имитации логического проекта.

Определите процедуру Scheme (bitAdder xab) для имитации логической схемы, приведенной в соответствии со схемой на рисунке 2. Процедура должна вызывать процедуры шлюза, которые вы определили в вопросе 1, и должна возвращать пару с двумя элементами '(s.c), где s — двоичная сумма a, b и x, а c — перенос. Вы реализуете процедуру в три шага, используя три процедуры, как указано ниже.

Напишите процедуру (sum-bit x a b) для генерации результирующего бита s.

Напишите процедуру (выполнение x a b) для генерации бита переноса c.

Напишите процедуру (bitAdder x a b) для генерации выходной пары (s.c).

До сих пор я определял свои логические элементы для «и», «или» и «исключающее ИЛИ». Я пытался сделать первые две процедуры, но они кажутся неправильными.

(define AND-gate (lambda (a b)
               (if (= a b 1)
                   1
                   0)))
(define OR-gate (lambda (a b)
              (if (= a 1)
                  1
                  (if (= b 1)
                      1
                      0))))
(define XOR-gate (lambda (a b)
               (if (= a b)
                   0
                   1)))
 (define sum-bit (lambda (x a b)
             (XOR-gate a b)
             (XOR-gate x (XOR-gate a b))))
  (define carry-out (lambda (x a b)
                (OR-gate a b)
                (AND-gate (OR-gate a b) x)
                (AND-gate a b)
                (OR-gate (AND-gate a b) (AND-gate (OR-gate a b) x))))

person jrsk8chivas    schedule 21.04.2015    source источник
comment
Что в них кажется неверным? Опишите ошибку, или как насчет того, что реализация ведет себя не так, как вы ожидаете.   -  person Ian    schedule 21.04.2015
comment
sum-bit оценивает (XOR-gate a b) и игнорирует это значение, а затем возвращает (XOR-gate x (XOR-gate a b)). Вы следуете той же схеме оценки и выбрасывания в carry-out.   -  person molbdnilo    schedule 23.04.2015


Ответы (1)


Определить ворота

#lang racket

(define (AND-gate A B)
  (if (= A B 1)
      1
      0))

(define (XOR-gate A B)
  (if (not (= A B))
      1
      0))

(define (OR-gate A B)
  (if (not (= 0 (+ A B)))
      1
      0))

Испытайте ворота

(module+ test
 (require rackunit
      rackunit/text-ui)

  (define-test-suite
    gate-tests
    (test-equal? "AND-gate" (AND-gate 1  1) 1)
    (test-equal? "XOR-gate" (XOR-gate 0  1) 1)
    (test-equal? "XOR-gate" (XOR-gate 1  0) 1)
    (test-equal? "XOR-gate" (XOR-gate 0  0) 0)
    (test-equal? "XOR-gate" (XOR-gate 1  1) 0)
    (test-equal? "AND-gate" (AND-gate 0  0) 0)
    (test-equal? "AND-gate" (AND-gate 0  1) 0)
    (test-equal? "AND-gate" (AND-gate 1  0) 0)
    (test-equal? "OR-gate"  (OR-gate  0  0) 0)
    (test-equal? "OR-gate"  (OR-gate  1  0) 1)
    (test-equal? "OR-gate"  (OR-gate  0  1) 1)
    (test-equal? "OR-gate"  (OR-gate  1  1) 1))

  (run-tests gate-tests))

Определить бит суммы

(define (sum-bit X A B)
  (XOR-gate X (XOR-gate A B)))

Тестовый бит суммы

(module+ test

  (define-test-suite
    sum-bit-tests
    (test-equal? "Sum-bit" (sum-bit 0 0 0) 0)
    (test-equal? "Sum-bit" (sum-bit 1 0 0) 1)
    (test-equal? "Sum-bit" (sum-bit 0 1 0) 1)
    (test-equal? "Sum-bit" (sum-bit 0 0 1) 1)
    (test-equal? "Sum-bit" (sum-bit 1 1 0) 0)
    (test-equal? "Sum-bit" (sum-bit 1 0 1) 0)
    (test-equal? "Sum-bit" (sum-bit 0 1 1) 0)
    (test-equal? "Sum-bit" (sum-bit 1 1 1) 1))

  (run-tests sum-bit-tests))

Определить бит переноса

(define (carry-bit X A B)
  (OR-gate (AND-gate A B)
           (OR-gate (AND-gate X A)
                    (AND-gate X B))))

Тестовый переносной бит

(module+ test
  (define-test-suite
    carry-bit-tests
    (test-equal? "Carry-bit" (carry-bit 0 0 0) 0)
    (test-equal? "Carry-bit" (carry-bit 1 0 0) 0)
    (test-equal? "Carry-bit" (carry-bit 0 1 0) 0)
    (test-equal? "Carry-bit" (carry-bit 0 0 1) 0)
    (test-equal? "Carry-bit" (carry-bit 1 1 0) 1)
    (test-equal? "Carry-bit" (carry-bit 1 0 1) 1)
    (test-equal? "Carry-bit" (carry-bit 0 1 1) 1)
    (test-equal? "Carry-bit" (carry-bit 1 1 1) 1))

  (run-tests carry-bit-tests))

Определить битовый сумматор

(define (bit-adder X A B)
  (cons (sum-bit X A B)
    (carry-bit X A B)))

Тестовый бит-сумматор

(module+ test
  (define-test-suite
    bit-adder-tests
    (test-equal? "Bit-adder" (bit-adder 0 0 0) '(0 . 0))
    (test-equal? "Bit-adder" (bit-adder 1 0 0) '(1 . 0))
    (test-equal? "Bit-adder" (bit-adder 0 1 0) '(1 . 0))
    (test-equal? "Bit-adder" (bit-adder 0 0 1) '(1 . 0))
    (test-equal? "Bit-adder" (bit-adder 1 1 0) '(0 . 1))
    (test-equal? "Bit-adder" (bit-adder 1 0 1) '(0 . 1))
    (test-equal? "Bit-adder" (bit-adder 0 1 1) '(0 . 1))
    (test-equal? "Bit-adder" (bit-adder 1 1 1) '(1 . 1)))

  (run-tests bit-adder-tests))

Запустите тесты

[email protected]> ,enter "/home/ben/StackOverflow/297774346.rkt"
12 success(es) 0 failure(s) 0 error(s) 12 test(s) run
0
8 success(es) 0 failure(s) 0 error(s) 8 test(s) run
0
8 success(es) 0 failure(s) 0 error(s) 8 test(s) run
0
8 success(es) 0 failure(s) 0 error(s) 8 test(s) run
0  

Сдать домашнее задание

В соответствии с академической политикой в ​​отношении работы других.

person ben rudgers    schedule 21.04.2015