Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog中的反向转换_Prolog_Lambda Prolog - Fatal编程技术网

Prolog中的反向转换

Prolog中的反向转换,prolog,lambda-prolog,Prolog,Lambda Prolog,想做下面的事情吗 SKI表达式到lambda表达式: L[I] = λx.x L[K] = λx.λy.x L[S] = λx.λy.λz.(x z (y z)) L[(E₁ E₂)] = (L[E₁] L[E₂]) 转换不需要涉及任何beta降低。但我 尽管如此,我还是想做一个特殊的beta减少。 无论何时存在线性重新计算或单位重新计算: (λx.E₁)E₂ x occurs at most once in E₁ 我想把它简化为: E₁[x/E₂] 从某种意义上说,这

想做下面的事情吗 SKI表达式到lambda表达式:

L[I] = λx.x

L[K] = λx.λy.x

L[S] = λx.λy.λz.(x z (y z))

L[(E₁ E₂)] = (L[E₁] L[E₂])
转换不需要涉及任何beta降低。但我 尽管如此,我还是想做一个特殊的beta减少。 无论何时存在线性重新计算或单位重新计算:

 (λx.E₁)E₂      x occurs at most once in E₁
我想把它简化为:

 E₁[x/E₂]
从某种意义上说,这似乎是一种安全的减少 它不会使redex变得更大,它只会移动 E的位置₂ 甚至消除了E₂ 如果x没有出现。 分别进行重命名。例如:

 L[S(S(K(S(KS)K))S)(KK)] = λx.λy.λz.xzy 

是否有任何Prolog实现?

这里是一个基于Debrijn索引的实现,以及 基于序言的答案。第一部分,, 将wikipedia中的L[ujn]翻译成Debrijn索引可以提供:

lambda(P*Q, W) :-
   lambda(P, R),
   lambda(Q, S),
   simplify(R, S, W).
lambda('I', b(0)).
lambda('K', b(b(1))).
lambda('S', b(b(b(2*0*(1*0))))).
线性简化中的新谓词是simplify/2、subs2/4、notin/2和oncein/2。shift/4与序言中的完全相同 答案。谓词subst2/4与subst/4形成对比 调用simplify/2生成应用程序术语:

simplify(b(R), _, S) :- notin(R, 0), !,
   shift(R, 0, -1, S).
simplify(b(R), S, T) :- oncein(R, 0), !,
   subst2(R, 0, S, T).
simplify(R, S, R*S).

subst2(P*Q, J, D, W) :- !,
   subst2(P, J, D, R),
   subst2(Q, J, D, S),
   simplify(R, S, W).
subst2(b(P), J, D, b(R)) :- !,
   K is J+1,
   subst2(P, K, D, R).
subst2(J, K, _, J) :- integer(J), J < K, !.
subst2(0, 0, D, D) :- !.
subst2(J, J, D, R) :- integer(J), !,
   shift(D, 0, J, R).
subst2(J, _, _, K) :- integer(J), !, K is J-1.
subst2(I, _, _, I).
这就是要解决的问题:

?- lambda('S'*('S'*('K'*('S'*('K'*'S')*'K'))*'S')*('K'*'K'), X).
X = b(b(b(2*0*1)))
该示例与此括号抽象并不完全相反:


将规范相当直接地转换为具有逻辑变量的表示形式:

combinator_lambda(i, lambda(X, X)).
combinator_lambda(k, lambda(X, lambda(_Y, X))).
combinator_lambda(s, lambda(X, lambda(Y, lambda(Z,
                        apply(apply(X, Z), apply(Y, Z)))))).
combinator_lambda(C1 * C2, Lambda) :-
    combinator_lambda(C1, L1),
    combinator_lambda(C2, L2),
    simplify(apply(L1, L2), Lambda).
    
simplify(Term, Simple) :-
    (   nonvar(Term),
        Term = apply(X, Y)
    ->  simplify(X, SimpleX),
        simplify(Y, SimpleY),
        (   nonvar(SimpleX),
            SimpleX = lambda(V, Exp),
            term_atmostonce(Exp, V)
        ->  apply(SimpleX, SimpleY, XY),
            simplify(XY, Simple)
        ;   Simple = apply(SimpleX, SimpleY) )
    ;   nonvar(Term),
        Term = lambda(V, Exp)
    ->  simplify(Exp, SimpleExp),
        Simple = lambda(V, SimpleExp)
    ;   Simple = Term ).
    
term_atmostonce(Term, NoOccurrence) :-
    term_variables(Term, Variables),
    forall(member(Var, Variables), Var \== NoOccurrence),
    !.
term_atmostonce(Term, Singleton) :-
    term_singletons(Term, Singletons),
    member(Var, Singletons),
    Var == Singleton,
    !.
    
apply(lambda(V, E), V, E).
term_singleton
是一个SWI Prolog实用程序。)

?- unlambda(b(b(b(2*0*1))), X).
X = 'S'*('S'*('K'*'S')*('S'*('K'*'K')*'S'))*('K'*'K')
combinator_lambda(i, lambda(X, X)).
combinator_lambda(k, lambda(X, lambda(_Y, X))).
combinator_lambda(s, lambda(X, lambda(Y, lambda(Z,
                        apply(apply(X, Z), apply(Y, Z)))))).
combinator_lambda(C1 * C2, Lambda) :-
    combinator_lambda(C1, L1),
    combinator_lambda(C2, L2),
    simplify(apply(L1, L2), Lambda).
    
simplify(Term, Simple) :-
    (   nonvar(Term),
        Term = apply(X, Y)
    ->  simplify(X, SimpleX),
        simplify(Y, SimpleY),
        (   nonvar(SimpleX),
            SimpleX = lambda(V, Exp),
            term_atmostonce(Exp, V)
        ->  apply(SimpleX, SimpleY, XY),
            simplify(XY, Simple)
        ;   Simple = apply(SimpleX, SimpleY) )
    ;   nonvar(Term),
        Term = lambda(V, Exp)
    ->  simplify(Exp, SimpleExp),
        Simple = lambda(V, SimpleExp)
    ;   Simple = Term ).
    
term_atmostonce(Term, NoOccurrence) :-
    term_variables(Term, Variables),
    forall(member(Var, Variables), Var \== NoOccurrence),
    !.
term_atmostonce(Term, Singleton) :-
    term_singletons(Term, Singletons),
    member(Var, Singletons),
    Var == Singleton,
    !.
    
apply(lambda(V, E), V, E).
?- combinator_lambda(s*(s*(k*(s*(k*s)*k))*s)*(k*k), Lambda), numbervars(Lambda). 
Lambda = lambda(A, lambda(B, lambda(C, apply(apply(A, C), B)))).