如何生成和运行随机的lambda表达式?

时间:2016-11-14 23:26:21

标签: lambda scheme lisp racket genetic-algorithm

我正在研究与遗传算法相关的学校项目。我需要创建一个近似算法,我创建随机的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))))

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

1 个答案:

答案 0 :(得分:0)

通常,如果我们只想用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))

来源