lambda Calculus符号语法错误序言

时间:2016-11-22 22:08:06

标签: prolog lambda-calculus

我正在尝试在Prolog中实现beta缩减,DCG和词典。 当我尝试编译时,它给了我一个语法错误,即操作符@。 我该如何解决?

beta(Exp,Exp):-
    atomic(Exp),
    !.

beta(lbd(V,F_body)@Exp,Result):-
    !,
    substitute(V,Exp,F_body,Result1),
    beta(Result1,Result).

beta(Exp,Result):-
    Exp=..ExpList,
    maplist(beta,ExpList,ResultList),
    Result=..ResultList.

s(SSem) --> np(NPSem), vp(VPSem),{var_replace(NPSem,NPSem1),beta(NPSem1@VPSem,SSem)}.

vp(VPSem) --> v(VSem), np(NPSem),{var_replace(VSem,VSem1),beta(VSem1@NPSem,VPSem)}.

np(lbd(p,p@john)) --> [john].

np(lbd(p,p@mary)) --> [mary].

v(lbd(s,lbd(x,s@lbd(y,likes(x,y))))) --> [likes].

1 个答案:

答案 0 :(得分:1)

您可以定义 @作为二元运算符,例如:

 :- op(500, xfy, @).

如果您在程序的顶部添加此指令,它将编译时没有错误和警告,并且您可以使用(@)/2作为中缀运算符。

示例:

?- write_canonical(a@b@c).
@(a,@(b,c))

我为这个操作符选择合适的 associativity 作为练习。