ASP入门者求助:为未定义的roomCost原子设置默认值
在ASP中实现原子的默认值逻辑
当然可以实现这种逻辑,核心是利用ASP的**默认否定(Negation as Failure, NaF)**特性,它正好对应你代码里“如果存在就用,不存在就用默认”的判断逻辑。
具体实现步骤:
- 定义一个辅助谓词(比如
actual_roomCost/1)来统一处理输入值和默认值:- 当输入中存在
roomCost(W)时,直接映射到actual_roomCost(W):actual_roomCost(W) :- roomCost(W). - 当输入中没有任何
roomCost原子时,启用默认值0:
这里的actual_roomCost(0) :- not roomCost(_).not roomCost(_)表示“不存在任何形式的roomCost原子”,_是通配符,匹配任意参数。
- 当输入中存在
- 修改你原来的
cost规则,改用这个辅助谓词:% creating rooms cost(create(room(R)), W) :- room(R), roomDomainNew(R), actual_roomCost(W).
为什么这样可行?
ASP的默认否定会在无法推导出roomCost(_)为真时,判定not roomCost(_)为真,这正好对应你Python代码里的if roomCost:判断逻辑:
- 如果输入里有
roomCost(5),第一条辅助规则会触发,actual_roomCost(5)生效,第二条辅助规则因为not roomCost(_)为假而不会触发; - 如果输入里没有任何
roomCost原子,第一条辅助规则没有触发条件,第二条辅助规则的not roomCost(_)为真,actual_roomCost(0)生效。
这样就不会出现默认值和输入值共存的问题,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Kaushik Ravishankar
相关产品推荐
相关产品推荐

