Java 删除Jess中的临时事实
我试图显示所有实例插槽值,并在通过以下规则处理其所有绑定后将其删除:Java 删除Jess中的临时事实,java,protege,jess,Java,Protege,Jess,我试图显示所有实例插槽值,并在通过以下规则处理其所有绑定后将其删除: (defrule findSourcesOfPollution (object (is-a http..#PollutionSources) (OBJECT ?sitepoll) (http..#potentialPollutant $? ?b&:(eq (instance-na
(defrule findSourcesOfPollution
(object
(is-a http..#PollutionSources)
(OBJECT ?sitepoll)
(http..#potentialPollutant
$? ?b&:(eq (instance-name ?b)(instance-name http..#BiochemicalOxygenDemand)) $?)
(..#pollutionSourceName ?psName)
(http..#pollutionType ?psType)
)
(object
(is-a http..#MeasurementSite)
(OBJECT ?loc)
(http..#hasSourcesOfPollution $? ?sitepoll $?)
)
(object
(is-a http..#tmpModerateMeasurement)
(OBJECT ?mob)
(http..#observationResultLocation ?loc)
)
=>
(printout t "pollution sources: " (instance-name ?sitepoll) " (Type: " ?psType ")" crlf)
(unmake-instance ?mob)
)
但是,该规则只输出一个污染源,因为unmake实例将删除该实例并停止显示其他绑定
编辑:
出于@laune comment的动机,我使用foreach循环尝试了以下方法,但仍然没有收到输出:
(defrule findSourcesOfPollution
(object
(is-a http..#MeasurementSite)
(OBJECT ?loc)
(http..#hasSourcesOfPollution $?sitepoll)
)
(object
(is-a http..#tmpModerateBODMeasurement)
(OBJECT ?mob)
(http..#observationResultLocation ?loc)
)
(bind ?poll nil)
=>
(foreach ?poll ?sitepoll
(slot-get ?poll http..#potentialPollutant)
(if(eq ?poll http..#BiochemicalOxygenDemand) then
(printout t "Pollution source: " (instance-name ?poll) " (Type: " ?loc ")" crlf)
)
)
)
将站点列表绑定到列表变量
(object
(is-a http..#MeasurementSite)
(OBJECT ?loc)
(http..#hasSourcesOfPollution $?sitepoll )
)
并在右侧迭代列表:
(foreach ?site ?sitepoll (printout ...))
感谢真主,然后感谢@laune,感谢他打开我的心扉来解决这个问题。主要问题来自slot get,它返回的是列表而不是字符串。解决方案规则如下:
(defrule findBOD5SourcesOfPollution
(object
(is-a http..#MeasurementSite)
(OBJECT ?loc)
(http..#hasSourcesOfPollution $?sitepoll)
)
(object
(is-a http..#tmpModerateBODMeasurement)
(OBJECT ?mob)
(http..#observationResultLocation ?loc)
)
=>
(foreach ?poll ?sitepoll
(foreach ?pollLsItem (slot-get ?poll http..#potentialPollutant)
(if(eq (instance-name ?pollLsItem) http..#BiochemicalOxygenDemand) then
(printout t "BOD5 pollution source: " (instance-name ?poll) " (Type: " (instance-name ?loc) ")" crlf)
)
)
)
(unmake-instance ?mob)
)
是的,应用foreach有帮助,但根本没有,因为?sitepoll应该被过滤掉,只包括生化需氧量和污染源见第一个目标条款。我尝试将?sitepoll转换为一个列表,即$?sitepoll,但没有生成任何输出,这是预期的,因为MeasurementSite对象中的列表$?sitepoll不等于变量?污染源对象中的sitepoll我尝试了foreach方法查看问题文本中的编辑部分,但仍然没有输出,我认为这是错误的由于?poll变量不能绑定在RHS.Grrr中,因此复制变量(包括有效美元)总是错误的。必须在RHS上安装?sitepoll。已编辑。已更正,但仍无法筛选?sitepoll列表,以仅包括生化需氧量和污染源的列表:在编辑后的规则中,您不使用实例名称,而是执行eq?poll http..BiochemicalOxygenDemand。也许您忽略了测试,只需打印列表中所有内容的实例名的结果。另外,sitepoll是否有元素你必须排除一种又一种可能性。如果有必要,可以通过Jess Technical的调用应用Java方法。对于回滚一个好的编辑,我们投了反对票。答案应该简洁,没有感谢和其他闲聊的内容。关于宗教内容是否应该在帖子中出现的讨论,请参阅。