Удалить временные факты в Джесс

Я пытаюсь отобразить все значения слотов экземпляра и, в конце концов, удалить его после того, как все его привязки обработаны с помощью следующего правила:

(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-instance удаляет экземпляр и останавливает отображение других привязок.

РЕДАКТИРОВАТЬ: мотивировано комментарием @laune Я попробовал следующий подход, используя 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)
        )
    )
)

2 ответа

Решение

Спасибо Аллаху, а затем @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)
)

Привязать список сайтов к переменной списка

(object 
    (is-a http..#MeasurementSite) 
    (OBJECT ?loc)
    (http..#hasSourcesOfPollution $?sitepoll )
) 

и на правой стороне итерация списка:

(foreach ?site ?sitepoll (printout ...))
Другие вопросы по тегам