【问题标题】:How can I generate and run random lambda expressions?如何生成和运行随机 lambda 表达式?
【发布时间】:2017-03-28 17:28:38
【问题描述】:

我正在从事与遗传算法相关的学校项目。我需要创建一个近似算法,在其中创建随机 lambda 表达式以近似正确的值,到目前为止,由于我提供了一个示例,我能够创建随机 lambda 表达式,但是,我被困在如何运行它们上,这是我的代码:

#lang racket
(define operators '(+ *))
(define operands '(a b x y))

(define element
  (lambda (L)
    (list-ref L (random (length L)))))

(define expression
  (lambda (n)
    (cond ((zero? n) (element operands))
          (else
           (list
            (element operators)
            (expression (random n))
            (expression (random n)))
           ))))

;Generates lambda expression
;n is the amount of expressions 
;p is the depth of each expression
;Examples below
(define generate
  (lambda (n p)
    (if (zero? n) empty
        (cons
         (list 'λ '(x y) (expression p))
         (generate (- n 1) p))
        )))

(generate 1 1)
'((λ (x y) (* b y)))
(generate 1 3)
'((λ (x y) (* (* y y) (* y y))))
(generate 2 1)
'((λ (x y) (+ b x)) (λ (x y) (+ b x)))
(generate 2 3)
'((λ (x y) (+ (+ a y) a)) (λ (x y) (* (+ (+ y y) (* a a)) (+ (+ y x) a))))

这些生成的表达式中的每一个都是随机的,并且是正确值的近似值。如果它们是列表,我如何运行这些生成的表达式?

【问题讨论】:

  • 尝试 (eval (car (generate 2 3))) 将第一个 lambda 转换为可以作为函数调用的真正 lambda。
  • @ThrowawayAccount3Million 是的,这是正确的,我必须使用 eval 并发送 namespace 参数。
  • 那么你的问题是什么?这就是你运行表达式的方式。

标签: lambda scheme lisp racket genetic-algorithm


【解决方案1】:

通常,如果我们只想计算给定 x 和 y 值的表达式,我们不需要 eval。 apply-formula 将使用更直接的方法,但是在这种情况下,我们运行的是程序生成的随机表达式,因此需要 eval。

eval 函数采用表达式或定义的表示形式(作为“引用”的形式或语法对象)并对其进行评估

这是一个关于如何运行 eval 的示例:

#lang racket
(define ns (make-base-namespace))
((eval '(lambda (x y) (+ x x)) ns) 1 1)

请注意,我们在每个 eval 调用中都发送命名空间

我的解决方案如下所示:

((eval (car (generate 2 2)) ns) 1 1)

如果你想测试我的代码,修改操作数使其看起来像这样(因为它现在只验证 x 和 y 变量):

(define operands '(x y))

来源

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多