Prolog模式匹配空格字符遇语法错误,如何正确转义空格?
解决Prolog中“Syntax error: Operator expected”的空格匹配问题
嗨,这个问题我之前也踩过坑!Prolog里的空格默认是项的分隔符,你直接写V W的时候,Prolog会把它当成两个独立的参数,而不是一个完整的复合项,这就是为啥会弹出“Operator expected”的语法错误——它不知道怎么处理这两个挨着的变量。
下面给你两种实用的解决方案,适配你想要匹配etp(A B,[A B,C D])的场景:
方案1:定义空格为合法的中缀运算符
你可以在代码开头添加一行运算符定义,让Prolog把空格当成一个连接两个元素的中缀符号,这样V W就会被解析成一个复合项' '(V,W):
% 定义空格为中缀运算符,优先级500,左右结合 op(500, xfx, ' '). etp(V W, [V W|G]). etp(W V, [V W|G]). etp(V W, [_|G]) :- etp(V W, G).
现在你再测试etp(A B, [A B, C D]),就能正常匹配返回true了。
方案2:用元组替代空格(更推荐)
如果不想修改Prolog的默认语法(避免后续可能的混淆),更常规的做法是用元组(V,W)来替代V W,这样不需要额外定义运算符,完全符合Prolog的原生语法:
etp((V,W), [(V,W)|G]). etp((W,V), [(V,W)|G]). etp((V,W), [_|G]) :- etp((V,W), G).
测试的时候写成etp((A,B), [(A,B), (C,D)])就可以正常运行啦。
补充:适配你的read_line生成逻辑
因为你的列表是通过read_line生成的,记得要修改生成逻辑,把读取到的两个元素(比如A和B)组合成对应的复合项——不管是用方案1的' '(A,B),还是方案2的(A,B),否则列表里会是独立的A、B、C、D,而不是你想要的[A B,C D]或[(A,B),(C,D)]结构。
内容的提问来源于stack exchange,提问作者DRINK
相关产品推荐
相关产品推荐

