如何在保留运算符'-'的前提下解决Prolog双重否定语法错误?
解决Prolog中双重否定的语法错误问题
嘿,这个问题我之前也踩过坑!核心原因是Prolog默认把'-'当成一元算术前缀运算符,类型是fx——这种类型的前缀运算符不允许连续出现,所以你写--a的时候,解析器会直接抛出语法错误。要解决这个问题,关键是重新定义'-'的运算符类型,让它支持连续嵌套使用。
下面是具体的解决步骤:
1. 重新定义'-'为右结合前缀运算符
在Prolog里,我们可以用op/3谓词来修改运算符的属性。把'-'定义为fy类型(前缀右结合),这样解析器就会把--a正确解析为-(-a),而不是当成语法错误。
执行这条语句:
op(900, fy, '-').
这里的900是运算符的优先级(可以根据你其他逻辑运算符的优先级调整,只要保证它符合你的命题逻辑运算顺序就行),fy表示这是一个右结合的前缀运算符,允许连续嵌套。
2. (可选)覆盖默认的算术'-'
如果你的Prolog环境里默认的算术'-'(比如用来表示负数的那个)和你自定义的逻辑否定运算符冲突,可以先取消默认的定义,再重新设置:
% 先取消默认的fx类型'-' op(0, fx, '-'). % 再定义逻辑否定的fy类型'-' op(900, fy, '-').
3. 测试验证
比如你已经定义了proposition/1谓词,现在执行查询:
?- proposition(--a).
这时候解析器会正确把--a解析为-(-a),不会再触发语法错误,你应该能看到预期的输出(比如你在proposition/1里写的打印内容)。
为什么fy类型能解决问题?
简单说:
fx类型的前缀运算符:左边不允许有同优先级的前缀运算符,所以连续两个'-'会被判定为语法错误fy类型的前缀运算符:支持右结合,意味着右边的同优先级前缀运算符会被优先解析成它的参数,所以--a会被拆解为-(-a),完全符合双重否定的逻辑结构
内容的提问来源于stack exchange,提问作者Martin Kunze
相关产品推荐
相关产品推荐

