Я просто делал домашнее задание для моего предстоящего теста OCaml, и у меня возникли некоторые проблемы.
Рассмотрите язык λ-термов, определяемый следующим абстрактным синтаксисом (где x — переменная):
t ::= x | t t | λx. t
Напишите терм типа для представления λ-термов. Предположим, что переменные представлены в виде строк.
Хорошо, мальчик.
# type t = Var of string | App of (t*t) | Abs of string*t;;
type t = Var of string | App of (t * t) | Abs of (string * t)
Свободные переменные fv(t) терма t определяются индуктивно следующим образом:
fv(x) = {x}
fv(t t') = fv(t) ∪ fv(t')
fv(λx. t) = fv(t) \ {x}
Конечно вещь.
# let rec fv term = match term with
Var x -> [x]
| App (t, t') -> (List.filter (fun y -> not (List.mem y (fv t'))) (fv t)) @ (fv t')
| Abs (s, t') -> List.filter (fun y -> y<>s) (fv t');;
val fv : t -> string list = <fun>
Например,
fv((λx.(x (λz.y z))) x) = {x,y}.
Давайте проверим это.
# fv (App(Abs ("x", App (Abs ("z", Var "y"), Var "z")), Var "x"));;
- : string list = ["y"; "z"; "x"]
Я проверял миллион раз и уверен, что результат должен включать переменную "z". Не могли бы вы меня в этом успокоить?
z
не является свободной переменной(λz.y z)
и, следовательно, не является свободной переменной(λx.(x (λz.y z))) x
. - person Pascal Cuoq   schedule 09.12.2012List.filter (fun y -> not (List.mem y (fv t'))) (fv t)
, хотя он пока кажется мне правильным, вычисляетfv t'
много раз. Вы должны вычислить его один раз с помощьюlet fv_t' = fv t' in …
и использоватьfv_t'
. - person Pascal Cuoq   schedule 09.12.2012λ
в лямбда-исчислении ассоциируется с тем же, что иfun
в OCaml. Выражениеfun x -> st uff
совпадает сfun x -> (st uff)
. - person Pascal Cuoq   schedule 09.12.2012λ
был таким же, какfun
в Caml», так что это правильный вопрос. Вместо того, чтобы удалять вопрос, вы должны записать свое открытие в качестве ответа и принять его. - person Pascal Cuoq   schedule 09.12.2012