将传递函数从Python转换为Racket

问题描述

我想在Racket中实现此功能。如何在球拍中重写此功能?

我在PYTHON中的代码

# function to check transitive relation
def is_transitive(relation):
    # for all (a,b) and (b,c) in Relation ; (a,c) must belong to Relation
    for a,b in relation:
        for c,d in relation:
            if b == c and ((a,d) not in relation):
                return False
    return True

transitive?将对列表作为唯一输入。该对列表表示二进制关系。如果该二进制关系是可传递的,则该函数应返回#t,如下所示。

> (transitive? '((1 2) (2 3) (1 3)))
#t
> (transitive? '((1 3) (1 2) (2 3)))
#t
> (transitive? '((1 2) (2 3)))
#f
> (transitive? '((1 1) (1 2) (2 1) (2 2) (3 3)))
#t
> (transitive? '((1 2) (3 3) (2 2) (2 1) (1 1)))
#t
> (transitive? '((2 3) (3 3) (1 2) (1 1)))
#f

到目前为止,我在球拍中的位置是这样:

(define (get-all-relations-of x set)
  (if (null? set)
      '()
      (if (equal? x (car (car set)))
          (cons (cdr (car set))
                (get-all-relations-of x (cdr set)))
          (get-all-relations-of x (cdr set)))))
    
(define (exist-relation? r set)
  (if (null? set)
      #f
      (if (equal? r (car set))
          #t
          (exist-relation? r (cdr set)))))
    
(define (exist-all-transitive-relations-of? x r set)
  (if (null? r)
      #t
      (if (not (exist-relation? (cons x (car r)) set))
          #f
          (exist-all-transitive-relations-of? x (cdr r) set))))
    
(define (transitive? set)
  (if (null? set)
      #t
      (if (and (not (null? (get-all-relations-of (cdr (car set)) set)))
               (not (exist-all-transitive-relations-of?
                     (car (car set))
                     (get-all-relations-of (cdr (car set)) set)
                     set)))
          #f
          (transitive? (cdr set)))))

仅当(exist-all-transitive-relations-of?of?x r set)为true时有效。

这是我的输出:

>(exist-all-transitive-relations-of? 1 '(2 5 6) '((1 2) (1 5) (6 8)))))
> #t
>(define (transitive? '((1 2) (2 6)))
> #f
>(define (transitive? '((1 2) (2 6)(2 7)(1 7)))
> #f
>(define (transitive? '((1 2) (2 6)(2 7)(1 7)(1 6)))
> #t

如何修改我的代码?这样我就不必单独测试(定义(exist-all-transitive-relations-of?x r set)是否为真

解决方法

这里只有一些关于球拍的评论:

操作时:

(if (condition) #f (else))

您可以使用短路将其转换为

(and (condition) (else))

类似

(if (condition) #t (else))

(or (condition) (else))

最后,在考虑替换python中的循环时,考虑现有的列表抽象非常重要。在这种情况下,您将获取一个列表并将其压缩为一条数据,特别是如果该属性针对一个成员而损坏,则为布尔值。因此,您应该使用andmap,这将大大减少您的代码:

(define (transitive? set)
  (andmap (lambda (x) (andmap (lambda (y)
       (local [(define a (first x))
               (define b (second x))
               (define c (first y))
               (define d (second y))]
       (not (and (= b c) (not (member `(,a,d) set)))))) set)) set))

注意:如果需要,(,d)可以替换为(list a d)(无准引用)。还有firstsecond以及carcadr

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...