我正在尝试在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].
答案 0 :(得分:1)
您可以定义 @
作为二元运算符,例如:
:- op(500, xfy, @).
如果您在程序的顶部添加此指令,它将编译时没有错误和警告,并且您可以使用(@)/2
作为中缀运算符。
示例:
?- write_canonical(a@b@c). @(a,@(b,c))
我为这个操作符选择合适的 associativity 作为练习。