2014-03-12 8 views
1

제스 코드에 작업 메모리의 두 가지 사실을 수정하려는 몇 가지 규칙이 있습니다. $?c가 멀티 슬롯입니다 (assert (analysis (reasons $?c) (total ?t))))작업 메모리에서 Jess multislot 팩트를 수정하는 방법

이유와 나는 규칙에 필요한 경우이 멀티 슬롯에 추가 할 : 주장 된

사실이다.

예 : 사용자가 너무 많은 술을 마시면 "안전하지 않은 많은 술을 마시고 있습니다."라는 텍스트를 원합니다. 멀티 슬롯 (reasons $?c)에 필드로 추가되었습니다. 어떻게이 작업을 수행 할 수 있습니까? 나는 많은 연구를 해봤지만 몇 가지 방법을 시도했지만 올바르게 작동하지는 않습니다.

답변

1

약간의주의가되어야한다 :

(defrule match 
;; (declare (no-loop true)) 
    ?t <- (Thing (what ?x)) 
    ?b <- (Box (id ?id)(things $?things&:(not (member$ ?x $?things)))) 
=> 
    (printout t ?id " not contains " ?x crlf) 
    (modify ?b (things (list $?things ?x))) 
) 

어느 쪽이든 당신은 어떤 루프를 사용하지 일반적으로 좀 더 기민한 접근법으로 간주되는 항목은 규칙이 추가 할 수있는 항목이 목록에 없는지 확인하는 제약 조건을 사용합니다. 특히 특정 "이유"가 하나 이상의 규칙에 의해 추가 될 수있는 경우.

+0

저는 각 규칙에서 $ 함수를 성공적으로 사용하여 이전에 발생한 반복을 발생시키지 않았습니다. 내 멀티 슬롯은 이제 성공적으로 수정되고 있지만 멀티 슬롯의 내용을 인쇄하는 두 번째 작업을하고 있습니까? 멀티 슬롯의 내용을 한 번에 한 줄씩 출력하는 방법은 무엇입니까? – Zain

+0

지금 멀티 슬롯의 내용을 출력했지만 내용이 모두 출력 라인에 함께 결합되었습니다. 개별 라인에 multislot의 값을 정중하게 출력하는 방법이 있습니까? – Zain

+0

'(foreach? el? list ...)'를 실행하여 약간의 deffunction을 작성해야합니다. 자세한 내용은 Jess 매뉴얼을 참조하십시오. – laune

1
어쩌면

하지 않는 가장 좋은 방법은, 그러나 그것은 간단합니다 규칙이 반복되지 않도록

(defrule modify-something 
?f <- (analysis (reasons $?c) (total ?t)))) 
=> 
(modify ?f (reasons (create$ ?c "hey"))))