2010-10-28 2 views
5

Я пишу лямбда-исчисление в F #, но я застрял на реализации бета-редукции (заменяя формальные параметры фактическими параметрами).Как бы вы реализовали функцию бета-сокращения в F #?

(lambda x.e)f 
--> e[f/x] 

Пример использования:

(lambda n. n*2+3) 7 
--> (n*2+3)[7/n] 
--> 7*2+3 

Так что я хотел бы услышать некоторые предложения в отношении того, как другие могут пойти по этому поводу. Любые идеи очень приветствуются.

Спасибо!

+0

BTW, пример, который я использовал, из обсуждения исчисления лямбда, найденного по адресу http://www.csse.monash.edu.au/~lloyd/tildeFP/Lambda/Ch/01.Calc.html – klactose

ответ

4

Предполагая, что ваше представление выражения выглядит

type expression = App of expression * expression 
       | Lambda of ident * expression 
       (* ... *) 

, у вас есть функция subst (x:ident) (e1:expression) (e2:expression) : expression, которая заменяет все свободные вхождения x с e1 в e2, и вы хотите оценить нормальный порядок, ваш код должен выглядеть примерно так это:

let rec eval exp = 
    match exp with 
    (* ... *) 
    | App (f, arg) -> match eval f with Lambda (x,e) -> eval (subst x arg e) 

функция subst должна работать следующим образом:

Для приложения функции оно должно называть себя рекурсивно для обоих подвыражений.

Для лямбд он должен называть себя по выражению тела лямбды в если аргументе имя лямбды никогда равно идентификатору вы хотите заменить (в этом случае вы можете просто оставить лямбда быть, потому что идентификатор не может появиться свободно где-нибудь внутри).

Для переменной она должна либо возвращать переменную без изменений, либо заменять-выражение в зависимости от того, совпадает ли имя переменной с идентификатором.

+0

Спасибо за ответ sepp2K. Вы в значительной степени получили суть того, что я пытаюсь сделать. Но часть, с которой я столкнулся с проблемой полной реализации, - это beta_reduce. Здесь вы ввели функцию под названием subst, которая делает то же самое, что и бета-версия, без объяснения того, как будет реализован subst. Что оставляет меня в том же положении, что и раньше. – klactose

+0

Помимо этого, ваш код довольно репрезентативен тем, как выглядит мой взгляд. – klactose

+0

О, и еще одна вещь ... разве вам не конец вашего приложения с eval (beta_reduce (x, e) arg)? В противном случае мы просто не возвращаем функцию, не применяя ее вообще? – klactose

Смежные вопросы