Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
测试函数关系和一对一关系的Scheme过程_Scheme_Racket_One To One - Fatal编程技术网

测试函数关系和一对一关系的Scheme过程

测试函数关系和一对一关系的Scheme过程,scheme,racket,one-to-one,Scheme,Racket,One To One,如果集合A中的任何元素A在集合B中存在唯一元素B,使得配对(AB)在集合R中,则集合A和B之间的关系R称为函数关系 (functional '(1 2 3) '(4 5 6) '((1 4) (2 4) (3 5)) ; ==> #t (functional '(1 2 3) '(4 5 6) '((1 4) (1 6) (2 5) (3 5)) ; ==> #f 一对一 (one-to-one '(1 2 3) '(4 5 6 7) '((1 4) (2 6) (3 7)) ;

如果集合A中的任何元素A在集合B中存在唯一元素B,使得配对(AB)在集合R中,则集合A和B之间的关系R称为函数关系

(functional '(1 2 3) '(4 5 6) '((1 4) (2 4) (3 5))
; ==> #t
(functional '(1 2 3) '(4 5 6) '((1 4) (1 6) (2 5) (3 5))
; ==> #f
一对一

(one-to-one '(1 2 3) '(4 5 6 7) '((1 4) (2 6) (3 7))
; ==> #t
(one-to-one '(1 2 3) '(4 5 6 7) '((1 4) (2 4) (3 7))
; ==> #f
(define one-to-one
  (lambda (a b r)
    (cond
      ((null? r)
       #t)
      ((one-to-one-helper (first r) (rest r))
       #f)
      (else
       (one-to-one a b (rest r))))))

(define one-to-one-helper
  (lambda (pair set)
    (cond
      ((null? set)
       #f)
      ((eq? (rest pair) (rest (first set)))
       #t)
      (else
       (one-to-one-helper pair (rest set))))))
这是我一对一的代码

(one-to-one '(1 2 3) '(4 5 6 7) '((1 4) (2 6) (3 7))
; ==> #t
(one-to-one '(1 2 3) '(4 5 6 7) '((1 4) (2 4) (3 7))
; ==> #f
(define one-to-one
  (lambda (a b r)
    (cond
      ((null? r)
       #t)
      ((one-to-one-helper (first r) (rest r))
       #f)
      (else
       (one-to-one a b (rest r))))))

(define one-to-one-helper
  (lambda (pair set)
    (cond
      ((null? set)
       #f)
      ((eq? (rest pair) (rest (first set)))
       #t)
      (else
       (one-to-one-helper pair (rest set))))))

我的第二个测试仪应该返回false,但它正在返回true

第二个测试用例结果为false的原因是,您的
一对一帮助程序
函数在测试相等性时使用
eq?
。举例说明:

> (eq? '(4) '(4))
#f
> (eqv? '(4) '(4))
#f
> (equal? '(4) '(4))
#t
鉴于

> (eq? 4 4)
#t
> (eqv? 4 4)
#t
> (equal? 4 4)
#t
因此,要解决问题,您可以更改为
equal?

((equal? (rest pair) (rest (first set)))
或者在原子元素上进行比较:

((eq? (cadr pair) (cadar set))
下面是一个内射(一对一)谓词函数的示例实现,使用
equal?
进行比较:

(define (injective? mapping)
  (define (one-to-one? pair mapping)
    (or (null? mapping)
        (and (not (equal? (cadr pair) (cadar mapping)))
             (one-to-one? (car mapping) (cdr mapping)))))
  (or (null? mapping)
      (and (one-to-one? (car mapping) (cdr mapping))
           (injective? (cdr mapping)))))
比如说,

> (injective? '((1 4) (2 6) (3 7)))
#t
> (injective? '((1 4) (2 4) (3 7)))
#f