Clingo中含括号的!=运算符语法错误问题咨询
Clingo中括号内使用
!=触发语法错误的原因 我正在开发一个Clingo应用,代码如下:
conflicting_hours(Course1, Section1, Room, Start1, Hour1) :- occupies(Course1, Section1, Room, Start1, Hour1), occupies(Course2, Section2, Room, Start2, Hour2), different_course(Course1,Course2,Section1,Section2), check_hour_intersection(Start1,Start2,Hour1) ; check_hour_intersection(Start2,Start1,Hour2). different_course(N1,N2,S1,S2) :- course(N1,S1,_,_,_,_,_,_), course(N2,S2,_,_,_,_,_,_), (N1!=N2 ; S1!=S2).
运行时出现如下错误:
soln.lp:62:8-10: error: syntax error, unexpected !=, expecting ) *** ERROR: (clingo): parsing failed
当我为(N1!=N2 ; S1!=S2)添加括号时会触发该错误,移除括号后语法正常但逻辑不符合需求,请问为何该语法是无效的?
问题原因与解决方案
Clingo(Answer Set Programming)的语法规则中,!=是一种语法糖,它仅能直接作为规则主体中的顶层文字使用,无法嵌套在括号包裹的析取/合取分组结构里。当你把N1!=N2放在括号内时,语法解析器无法正确识别这种简写形式——括号上下文里期望的是标准原子或带否定的原子表达式,而非!=这类简化写法。
要实现你需要的逻辑,需要把!=替换为标准的否定相等形式not(X=Y),或者使用Clingo支持的内置谓词neq/2,修改后的different_course规则如下:
方案1:使用not(X=Y)
different_course(N1,N2,S1,S2) :- course(N1,S1,_,_,_,_,_,_), course(N2,S2,_,_,_,_,_,_), (not(N1=N2) ; not(S1=S2)).
方案2:使用内置neq/2谓词
different_course(N1,N2,S1,S2) :- course(N1,S1,_,_,_,_,_,_), course(N2,S2,_,_,_,_,_,_), (neq(N1,N2) ; neq(S1,S2)).
另外,移除括号后语法正常但逻辑不符的原因是:ASP中;的优先级低于规则主体的逗号,无括号时规则会被解析为:
different_course(N1,N2,S1,S2) :- (course(N1,S1,_,_,_,_,_,_), course(N2,S2,_,_,_,_,_,_), N1!=N2) ; S1!=S2.
这会导致S1!=S2脱离前面的课程存在性条件,单独触发规则,完全偏离了你原本需要的“两个课程不同,或两个班级不同且均存在对应课程记录”的逻辑。
内容的提问来源于stack exchange,提问作者OzanCinci
相关产品推荐
相关产品推荐

