Будет ли рекурсивно вызванная переменная свободной или связанной? - PullRequest
1 голос
/ 10 февраля 2020

Я пытаюсь лучше понять свободные и связанные переменные. Вот пример кода:

(define (what-kind-of-var? guess x)
    (< (abs (- (square guess) x))
        0.001))

Я вижу, что связанные переменные здесь будут guess и x, а свободные переменные <, abs, - и square , Что если я позвоню what-kind-of-var? рекурсивно? Будет ли это связанная переменная, потому что она сама связана?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 10 февраля 2020

Вам необходимо прочитать справочник по логике c или лямбда-исчислению, отсюда происхождение понятия переменной.

Когда переменная находится внутри функции, и эта функция принимает в качестве параметра эту переменную, оно связано, независимо от того, является ли функция рекурсивной или нет.

Идея связывания означает, что место в памяти выделено, а переменный символ обозначает это место. Не каждое связанное местоположение может быть доступно переменной.

В случае свободных переменных существует много способов связать его с чем-либо (на языке C некоторые свободные переменные связаны процессом связывания, а некоторые никогда не связаны). В Лиспе есть много способов связать свободную переменную - динамическое связывание c, статическое / контекстное связывание или lisp_N , с N > 2 существует множество различных способов связать переменную , Но какова бы ни была реализация переменной, источником концепции является математическая логика c.

0 голосов
/ 10 февраля 2020

Это было бы при динамическом связывании c, но Схема имеет лексическую область видимости.

Но на самом деле это не так. «Свободный» или «связанный» исходит из лямбда-исчисления. what-kind-of-var? - это переменная верхнего уровня , именующая это лямбда-выражение,

(define what-kind-of-var? 
  (lambda (guess x)                        ;; this
     (< (abs (- (square guess) x))
         0.001)))

, но в лямбда-исчислении выражения не могут быть названы. Единственный способ назвать его рекурсивно в лямбда-исчислении - это использовать Y комбинатор:

((Y (lambda (what-kind-of-var?)                ;; outer
      (lambda (guess x)                            ;; inner
         (if (< (abs (- (square guess) x))
                0.001)
           guess
           (what-kind-of-var? (+ 1 guess) x)))))
  4 25)

, и теперь, конечно, what-kind-of-var? связан внутри этой новой лямбды выражение под Y. Она свободна во вложенной внутренней лямбде, но связана во внешней.

0 голосов
/ 10 февраля 2020
  • guess и x являются параметрами. Они в конечном итоге привязываются (к соответствующим аргументам) при применении функции.

  • <, abs, -, фактически связаны с процедурами в исходной среде. Так что они не являются свободными переменными.

  • square будет свободной переменной при условии, что what-kind-of-var? не определено в ее области действия. (обратите внимание, что sqr связан в исходной среде).

  • what-kind-of-var? также не является несвязанным, даже если он вызывает себя рекурсивно (при условии, что рекурсия правильно реализована в языке) , (define (f param) body) можно увидеть как (define f (lambda (param) body)

...