将可传递函数从Python转换为Racket

2024-04-23 06:31:52 发布

您现在位置: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)))))

只有当(存在?x r集的所有传递关系)为真时,它才起作用

以下是我的输出:

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

如何修改我的代码?所以我不必单独测试(define(exist-all-transitive relations of?xr set))是否为真


Tags: ofingetifnotallcarnull
1条回答
网友
1楼 · 发布于 2024-04-23 06:31:52

以下是对您的球拍的几点评论:

当您这样做时:

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

注意:(,a ,d)可以根据需要替换为(list a d)(无准注释)。以及{}和{}与{}和{}的关系

相关问题 更多 >