variable bound check in a clips rule RHS - clips

checkIntfIntVlanMemberConfigRule = """
(defrule checkSubIntfIntVlanMemberConfigRule
(checkIntf (intf ?intf) )
(SwitchIntfConfig (intf ?intf) (switchportMode "routed") (nativeVlan ?intVlan))
(or (not (VlanStatus (vlan ?intVlan) (intf ?intf)) )
?f <- (VlanStatus (vlan ?intVlan) (intf ?intf)) )
=>
(if (isbound ?f) then (printout t "PASS: vlanStatus exists for " ?intf " " ?intVlan crlf) (return 0) )
(printout t "vlanStatus does not exist for " ?intf " " ?intVlan crlf)
)"""
In the above clips rule, what is the equivalent clips buildin function for (isbound ?f) ? In general is there any buildin function to check in RHS if a variable was bound in LHS?

There is no functionality for determining if a variable has been bound. The or conditional element is implemented by creating rules for each conditional element contained with the or, so your existing rule is converted to the following:
(defrule checkSubIntfIntVlanMemberConfigRule-1
(checkIntf (intf ?intf) )
(SwitchIntfConfig (intf ?intf) (switchportMode "routed") (nativeVlan ?intVlan))
(not (VlanStatus (vlan ?intVlan) (intf ?intf))
=>
(if (isbound ?f) then (printout t "PASS: vlanStatus exists for " ?intf " " ?intVlan crlf) (return 0) )
(printout t "vlanStatus does not exist for " ?intf " " ?intVlan crlf)
)
(defrule checkSubIntfIntVlanMemberConfigRule-2
(checkIntf (intf ?intf) )
(SwitchIntfConfig (intf ?intf) (switchportMode "routed") (nativeVlan ?intVlan))
?f <- (VlanStatus (vlan ?intVlan) (intf ?intf))
=>
(if (isbound ?f) then (printout t "PASS: vlanStatus exists for " ?intf " " ?intVlan crlf) (return 0) )
(printout t "vlanStatus does not exist for " ?intf " " ?intVlan crlf)
)
You need to implement this as two separate rules so the RHS for each can be different:
(defrule checkSubIntfIntVlanMemberConfigRule-1
(checkIntf (intf ?intf) )
(SwitchIntfConfig (intf ?intf) (switchportMode "routed") (nativeVlan ?intVlan))
(not (VlanStatus (vlan ?intVlan) (intf ?intf)))
=>
(printout t "vlanStatus does not exist for " ?intf " " ?intVlan crlf)
)
(defrule checkSubIntfIntVlanMemberConfigRule-2
(checkIntf (intf ?intf) )
(SwitchIntfConfig (intf ?intf) (switchportMode "routed") (nativeVlan ?intVlan))
?f <- (VlanStatus (vlan ?intVlan) (intf ?intf))
=>
(printout t "PASS: vlanStatus exists for " ?intf " " ?intVlan crlf)
)
Alternately you can test for the existence of the fact from the RHS of the rule using the fact query functions:
(defrule checkSubIntfIntVlanMemberConfigRule
(checkIntf (intf ?intf) )
(SwitchIntfConfig (intf ?intf) (switchportMode "routed") (nativeVlan ?intVlan))
(VlanStatus (vlan ?intVlan) (intf ?intf))
=>
(if (any-factp ((?f VlanStatus)) (and (eq ?f:vlan ?intVlan) (eq ?f:intf ?intf)))
then
(printout t "PASS: vlanStatus exists for " ?intf " " ?intVlan crlf)
else
(printout t "vlanStatus does not exist for " ?intf " " ?intVlan crlf)))

Related

CLIPS does not recognize deftemplate name

I am trying to retract a deftemplate fact but when I do this CLIPS keeps saying I have to first declare the deffunction yet it is the appropriate deftemplate.What seems to be the problem?
I have attached the related code:
I get this error:
[EXPRNPSR3] Missing function declaration for Agriculture.
What seems to be the problem?
(deftemplate Agriculture
(slot weed
(type SYMBOL)
(allowed-symbols B G))
(slot crop
(type SYMBOL)
(allowed-symbols C S))
(slot organic-matter
(type INTEGER)
(allowed-values 1 2 3)))
(defrule Sencor-1
(and (Agriculture(weed B))
(Agriculture(crop C|S))
(Agriculture(organic-matter 1)))
=>
(printout t "Do not use Sencor!!"crlf))
(defrule Sencor-2
(and (Agriculture(weed B))
(Agriculture(crop C|S))
(Agriculture(organic-matter 2|3)))
=>
(printout t " " crlf "Use 3/4 pt/ac of Sencor" crlf ))
(defrule Lasso-1
(and (Agriculture(weed B|G))
(Agriculture(crop C|S))
(Agriculture(organic-matter 1)))
=>
(printout t crlf"Use 2 pt/ac of Lasso" crlf))
(defrule Lasso-2
(and (Agriculture(weed B|G))
(Agriculture(crop C|S))
(Agriculture(organic-matter 2)))
=>
(printout t crlf "Use 1 pt/ac of Lasso" crlf))
(defrule Lasso-3
(and (Agriculture(weed B|G))
(Agriculture(crop C|S))
(Agriculture(organic-matter 3)))
=>
(printout t crlf "Use 0.5 pt/ac of Lasso" crlf))
(defrule Bicep-1
(and (Agriculture(weed B|G))
(Agriculture(crop C))
(Agriculture(organic-matter 1)))
=>
(printout t crlf "Use 1.5 pt/ac of Bicep" crlf))
(defrule Bicep-2
(and (Agriculture(weed B|G))
(Agriculture(crop C))
(Agriculture(organic-matter 2)))
=>
(printout t crlf"Use 2.5 pt/ac of Bicep" crlf))
(defrule Bicep-3
(and (Agriculture(weed B|G))
(Agriculture(crop C))
(Agriculture(organic-matter 3)))
=>
(printout t crlf "Use 3 pt/ac of Bicep" crlf))
(defrule input
(initial-fact)
=>
(printout t crlf "What is the crop? (C:corn,S:soybean)")
(bind ?a (read))
(assert(Agriculture(crop ?a))) ;gets input from user
(printout t crlf "What is the weed problem? (B:broadleaf, G:grass)")
(bind ?b (read))
(assert(Agriculture(weed ?b)))
(printout t crlf "What is the % of organic matter content? (1:<2%,2:2-4%,3:>4%)")
(bind ?c (read))
(assert(Agriculture(organic-matter ?c)))
?d <- (Agriculture(crop ?a) (weed ?b) (organic-matter ?c))
(printout t ""crlf crlf "RECOMMENDATIONS:"crlf)
(retract ?d))
In the RHS of the input rule you state:
?d <- (Agriculture(crop ?a) (weed ?b) (organic-matter ?c))
This is interpreted as "Run function Agriculture and bind its results into ?d".
What you probably are trying to do is:
(bind ?d (assert (Agriculture (crop ?a) (weed ?b) (organic-matter ?c))))

CLIPS who is son or daughter, father or mother, grandfather or grandmother

I have a quite simple program but never use CLIPS.
My task is to show who is who and for whom.
I tried to remake code from my classes but it doesn't work:
(defrule MAIN::son
(or (father ?x ?y)
(mother ?x ?y)
)
(m ?y)
=>
(assert(son ?y ?x))
(printout t ?y " is son to " ?x crlf)
)
(defrule MAIN::daughter
(or (father ?x ?y)
(mother ?x ?y)
)
(f ?y)
=>
(assert(daughter ?y ?x))
(printout t ?y " is daughter to " ?x crlf)
)
(defrule MAIN::grandfather
(or (father ?x ?y)
(mother ?x ?y)
)
(father ?z ?x)
(m ?z)
=>
(assert(grandfather ?z ?y))
(printout t ?z " is grandfather to " ?y crlf)
)
(defrule MAIN::grandmother
(or (father ?x ?y)
(mother ?x ?y)
)
(mother ?z ?x)
(f ?z)
=>
(assert(grandmother ?z ?y))
(printout t ?z " is grandmother to " ?y crlf)
)
(defrule MAIN::grandson
(or (father ?x ?y)
(mother ?x ?y)
)
(or (father ?y ?z)
(mother ?y ?z)
)
(m ?z)
=>
(assert(grandson ?z ?x))
(printout t ?z " is grandson to " ?x crlf)
)
(defrule MAIN::granddaughter
(or (father ?x ?y)
(mother ?x ?y)
)
(or (father ?y ?z)
(mother ?y ?z)
)
(f ?z)
=>
(assert(grandson ?z ?x))
(printout t ?z " is granddaughter to " ?x crlf)
)
(defrule MAIN::brother
(or (father ?x ?y)
(mother ?x ?y)
)
(or (father ?x ?z)
(mother ?x ?z)
)
(notancestor ?y ?z)
(m ?z)
=>
(assert(brother ?z ?y))
(printout t ?z " is brother "to ?x crlf)
)
(defrule MAIN::sister
(or (father ?x ?y)
(mother ?x ?y)
)
(or (father ?x ?z)
(mother ?x ?z)
)
(notancestor ?y ?z)
(f ?z)
=>
(assert(sister ?z ?y))
(printout t ?z " is sister to " ?x crlf)
)
(defrule MAIN::near_ancestor
(or (father ?x ?y)
(mother ?x ?y)
)
(or (father ?x ?z)
(mother ?x ?z)
)
=>
(assert(near_ancestor ?z ?y))
(printout ?z " is near_ancestor to " ?x crlf)
)
(defrule MAIN::ancestor
(ancestor ?x ?y)
(near_ancestor ?y ?z)
=>
(assert(ancestor ?x ?z))
(printout t ?z " is ancestor to " ?x crlf)
)
(defrule MAIN::near_descendant
(or (father ?x ?y)
(mother ?x ?y)
)
(or (father ?x ?z)
(mother ?x ?z)
)
=>
(assert(near_descendant ?y ?z))
(printout t ?x " is near_descendant to" ?z crlf)
)
(defrule MAIN::descendant
(descendant ?x ?y)
(near_descendant ?y ?z)
=>
(assert(descendant ?z ?x))
(printout t ?x " is descendant to " ?z crlf)
)
I'm not sure about entries data:
(deffacts startup
(father Adam Kain)
(father Adam Abel)
(father Adam Set)
(mother Ewa Kain)
(mother Ewa Abel)
(mother Ewa Set)
)
I have such error in CLIPS
CLIPS> (run)
[ROUTER1] Logical name Set was not recognized by any routers
Ewa is near_descendant to Set
[ROUTER1] Logical name Abel was not recognized by any routers
Ewa is near_descendant to Abel
[ROUTER1] Logical name Kain was not recognized by any routers
Ewa is near_descendant to Kain
[ROUTER1] Logical name Set was not recognized by any routers
Ewa is near_descendant to Set
[ROUTER1] Logical name Set was not recognized by any routers
Ewa is near_descendant to Set
[ROUTER1] Logical name Abel was not recognized by any routers
Ewa is near_descendant to Abel
[ROUTER1] Logical name Kain was not recognized by any routers
Ewa is near_descendant to Kain
[ROUTER1] Logical name Abel was not recognized by any routers
Ewa is near_descendant to Abel
[ROUTER1] Logical name Kain was not recognized by any routers
Ewa is near_descendant to Kain
[ROUTER1] Logical name Set was not recognized by any routers
Adam is near_descendant to Set
[ROUTER1] Logical name Abel was not recognized by any routers
Adam is near_descendant to Abel
[ROUTER1] Logical name Kain was not recognized by any routers
Adam is near_descendant to Kain
[ROUTER1] Logical name Set was not recognized by any routers
Adam is near_descendant to Set
[ROUTER1] Logical name Set was not recognized by any routers
Adam is near_descendant to Set
[ROUTER1] Logical name Abel was not recognized by any routers
Adam is near_descendant to Abel
[ROUTER1] Logical name Kain was not recognized by any routers
Adam is near_descendant to Kain
[ROUTER1] Logical name Abel was not recognized by any routers
Adam is near_descendant to Abel
[ROUTER1] Logical name Kain was not recognized by any routers
Adam is near_descendant to Kain
And I've stuck on it.
I will be appreciated for any help
This line in your code
(printout ?z " is near_ancestor to " ?x crlf)
should be this
(printout t ?z " is near_ancestor to " ?x crlf)

Finding the count of repetitions of words (Clips)

I have a task, write a program to count the number of repetitions of a word in the list.
I just started learning the clips so I do not know many things.
I wrote the code, but unfortunately it does not work, what could be the error?
(clear)
(deftemplate list_1
(slot numeral)
)
(deftemplate list_2
(slot numeral)
)
(deftemplate list_3
(slot numeral)
)
(deffacts start
(list_1 (numeral zero))
(list_1 (numeral one))
(list_1 (numeral two))
(list_2 (numeral zero))
(list_2 (numeral two))
(list_2 (numeral three))
(list_3 (numeral zero))
(list_3 (numeral one))
(list_3 (numeral three))
)
(defglobal
?*countword* = 0
)
(defrule inputword
(initial-fact)
=>
(printout t crlf “Enter a word to search for: “)
(bind ?i (read))
(assert (wordforsearch ?i))
)
(defrule searchword
(wordforsearch ?i)
(list_1 (numeral ?i))
(list_2 (numeral ?i))
(list_3 (numeral ?i))
=>
(bind ?*countword* (+ ?*countword* 1))
)
(defrule outputword
(wordforsearch ?i)
=>
(printout t "Number of repetitions for a word: " ?i " = " ?*countword* crlf)
(reset)
(halt)
)
(run)
I really hope the same way that you explain in detail what the error is and maybe tell me another version of the implementation of the code.
P. S. I implemented another version of the program - the search for the number of repetitions of words in the sentence. This code also does not work.
(clear)
(defglobal
?*countword* = 0
)
(defrule inputword
(initial-fact)
=>
(printout t crlf “Enter a sentence: “)
(bind ?s (read))
)
(defrule inputword
(?s)
=>
(printout t crlf “Enter a word to search for: “)
(bind ?i (read))
(assert (wordforsearch ?i))
)
(defrule searchword
(wordforsearch ?i)
(?s ?i)
=>
(bind ?*countword* (+ ?*countword* 1))
)
(defrule outputword
(wordforsearch ?i)
=>
(printout t "Number of repetitions for a word: " ?i " = " ?*countword* crlf)
(reset)
(halt)
)
(run)
I really hope for your help in understanding the clips.
P. P. S. Sorry for my english
I can offer here this option. This has many shortcomings, but as an example this will suitable.
(defglobal
?*i* = 0
?*count* = 0
?*string* = (create$)
?*wordsearch* = ""
?*wordsearch1* = (create$)
)
(defrule Searching
?fact <- (searching)
=>
(retract ?fact)
(bind ?*i* (+ ?*i* 1))
(if (<= ?*i* (length ?*string*))
then
(if (eq ?*wordsearch1* (subseq$ ?*string* ?*i* ?*i*))
then
(bind ?*count* (+ ?*count* 1))
(assert (searching))
else
(assert (searching))
)
else
(printout t "Word " ?*wordsearch* " repeats " ?*count* " times" crlf)
)
)
(defrule Start
=>
(printout t crlf "Enter the string: ")
(bind ?*string* (create$ (explode$ (lowcase (readline)))))
(printout t crlf "Enter a word to search for: ")
(bind ?*wordsearch* (lowcase (readline)))
(bind ?*wordsearch1* (create$ (explode$ ?*wordsearch*)))
(assert (searching))
)

Some problems with using "deftemplate"

I'm trying to change the code of the expert system (The Engine Diagnosis Expert System) Add disordered patterns - . Clip does not produce errors, but the questions are not loaded. What am I doing wrong?
(deftemplate your_car "This is template for describing condition car"
(slot working-state (default undefined))
(slot rotation-state (default undefined))
(slot spark-state (default undefined))
(slot charge-state (default undefined))
(slot symptom (default undefined))
(slot repair(default undefined))
)
(deffunction ask-question (?question $?allowed-values)
(printout t ?question)
(bind ?answer (read))
(if (lexemep ?answer)
then
(bind ?answer (lowcase ?answer)))
(while (not (member ?answer ?allowed-values)) do
(printout t ?question)
(bind ?answer (read))
(if (lexemep ?answer)
then
(bind ?answer (lowcase ?answer))))
?answer
)
;-----------------------------------------------------------------------------------
(deffunction yes-or-no-p (?question)
(bind ?response (ask-question ?question yes no у n))
(if (or (eq ?response yes) (eq ?response y))
then
TRUE
else
FALSE)
)
;-----------------------------------------------------------------------------------
(defrule determine-engine-state ""
;(your_car (working-state undefined))
;(your_car (repair undefined))
?f1 <- (your_car (working-state undefined)(repair undefined))
=>
(if (yes-or-no-p "Does the engine start (yes/no)? ")
then
(if (yes-or-no-p "Does the engine run normally (yes/no)? ")
then
(modify ?f1 (working-state "engine normal"))
else
(modify ?f1 (working-state "engine unsatisfactory")))
else
(modify ?f1 (working-state "engine does-not-start"))))
;...
;-----------------------------------------------------------------------------------
(defrule no-repairs ""
(declare (salience -10))
;(your_car (repair undefined))
?f1 <- (your_car (repair undefined))
=>
(modify ?f1 (repair "Take your car to a mechanic."))
)
(defrule print-repair ""
(declare (salience 10))
;(your_car (repair ?item))
?f1 <- (your_car (repair ?item))
=>
(printout t crlf crlf)
(printout t "Suggested Repair:")
(printout t crlf crlf)
(format t " %s%n%n%n" ?item)
)
;-----------------------------------------------------------------------------------
(defrule system-banner ""
(declare (salience 10))
=>
(printout t crlf crlf)
(printout t "****************************************" crlf)
(printout t "* The Engine Diagnosis Expert System *" crlf)
(printout t "****************************************" crlf)
(printout t crlf crlf)
)
A deftemplate defines the structure of a fact, but it does not create them. Add a deffacts to your program after the deftemplate definition.
(deffacts start
(your_car))
When a (reset) command is issued, this will assert the facts contained in any deffacts constructs.
CLIPS> (clear)
CLIPS>
(deftemplate your_car "This is template for describing condition car"
(slot working-state (default undefined))
(slot rotation-state (default undefined))
(slot spark-state (default undefined))
(slot charge-state (default undefined))
(slot symptom (default undefined))
(slot repair(default undefined))
)
CLIPS>
(deffacts start
(your_car))
CLIPS>
(deffunction ask-question (?question $?allowed-values)
(printout t ?question)
(bind ?answer (read))
(if (lexemep ?answer)
then
(bind ?answer (lowcase ?answer)))
(while (not (member ?answer ?allowed-values)) do
(printout t ?question)
(bind ?answer (read))
(if (lexemep ?answer)
then
(bind ?answer (lowcase ?answer))))
?answer
)
CLIPS>
(deffunction yes-or-no-p (?question)
(bind ?response (ask-question ?question yes no у n))
(if (or (eq ?response yes) (eq ?response y))
then
TRUE
else
FALSE)
)
CLIPS>
(defrule determine-engine-state ""
?f1 <- (your_car (working-state undefined)(repair undefined))
=>
(if (yes-or-no-p "Does the engine start (yes/no)? ")
then
(if (yes-or-no-p "Does the engine run normally (yes/no)? ")
then
(modify ?f1 (working-state "engine normal"))
else
(modify ?f1 (working-state "engine unsatisfactory")))
else
(modify ?f1 (working-state "engine does-not-start"))))
CLIPS>
(defrule no-repairs ""
(declare (salience -10))
?f1 <- (your_car (repair undefined))
=>
(modify ?f1 (repair "Take your car to a mechanic."))
)
CLIPS>
(defrule print-repair ""
(declare (salience 10))
?f1 <- (your_car (repair ?item))
=>
(printout t crlf crlf)
(printout t "Suggested Repair:")
(printout t crlf crlf)
(format t " %s%n%n%n" ?item)
)
CLIPS>
(defrule system-banner ""
(declare (salience 10))
=>
(printout t crlf crlf)
(printout t "****************************************" crlf)
(printout t "* The Engine Diagnosis Expert System *" crlf)
(printout t "****************************************" crlf)
(printout t crlf crlf)
)
CLIPS> (reset)
CLIPS> (run)
Suggested Repair:
undefined
****************************************
* The Engine Diagnosis Expert System *
****************************************
Does the engine start (yes/no)? yes
Does the engine run normally (yes/no)? yes
Suggested Repair:
undefined
Suggested Repair:
Take your car to a mechanic.
CLIPS>

clips [EXPRNPSR3] Missing function declaration for person

; template person
(deftemplate person
(slot name (type STRING))
(slot gender (type SYMBOL)(allowed-symbols m f)); male, female
(slot birthyear (type INTEGER))
(slot birthPlace(type STRING))
(slot Fname (type STRING))
(slot Mname (type STRING))
(multislot siblingsName (type STRING))
(slot spouse (type STRING))
(slot height (type INTEGER))
(slot weight (type INTEGER))
(slot hairColor (type STRING))
(slot eyeColor (type STRING))
(multislot oddHabits (type STRING))
)
; menu
(defrule menu
(declare (salience 9000))
(initial-fact)
=>
(printout t crlf
"Menu : " crlf
" 1- Infer family relations " crlf
" 2- Add additional members " crlf
" 3- Modify properties of already existing members " crlf
" 4- List properties of a specific individual by name or reference. " crlf
" 5- Find for all individuals matching a certain property. " crlf
" 6- Find all individuals matching two properties. " crlf
" 7- Display family relations (same like 1) along with their height comparison." crlf
" 8- exit the program" crlf
"Choose 1 - 8 -> "
)
(assert (task type =(read)))
)
; exit
(defrule Exit
(task type 8)
=>
(exit)
)
(defrule AddMember
(task type 2)
=>
(printout t "Enter Name" crlf)
(bind ?name (read))
(printout t "Enter gender" crlf)
(bind ?G (read))
(printout t "Enter birth year" crlf)
(bind ?BY(read))
(printout t "Enter birth place" crlf)
(bind ?BP(read))
(printout t "Enter Father name " crlf)
(bind ?FN (read))
(printout t "Enter Mother name" crlf)
(bind ?MN(read))
(printout t "Enter siblings" crlf)
(bind ?SI(readline))
(printout t "Enter spouse" crlf)
(bind ?SP (read))
(printout t "Enter height" crlf)
(bind ?H (read))
(assert
(person
(name ?name)(gender ?G)(birthyear ?BY)(birthPlace ?BP)(Fname ?FN)(Mname ?MN)(siblingsName ?SI )(spouse ?SP) (height ?H))
)
)
(defrule Modify
(task type 3)
=>
(printout t " (a) to modify gender" crlf)
(printout t " (b) to modify Birth Year" crlf)
(printout t " (c) to modify Birth Place" crlf)
(printout t " (d) to modify Father Name" crlf)
(printout t " (e) to modify Mother Name" crlf)
(printout t " (f) to modify Spouse" crlf)
(printout t " (g) to modify height" crlf)
(printout t " (h) to modify weight" crlf)
(assert (task type =(read)))
)
(defrule ModifyGender
(task type a)
=>
(printout t "Enter the name of person that you want to modify" crlf)
(bind ?n (read))
(printout t " Enter new value" crlf)
(bind ?V (read))
?num <- (person (name ?n))
(printout t " num is " ?num " " crlf)
(modify ?num (gender ?V))
)
When loading the file of my project an error shows up:
[EXPRNPSR3] Missing function declaration for person.
Error:
(defrule MAIN::ModifyGender
(task type a)
=>
(printout t "Enter the name of person that you want to modify" crlf)
(bind ?n (read))
(printout t " Enter new value" crlf)
(bind ?V (read))
?num
<-
Can anyone help me?
Patterns matching facts are only allowed in the condition portion of a rule, not in the actions of the rule. You can either use multiple rules to determine which person to change and to apply the change:
(defrule ModifyGender-ask
?f <- (task type a)
=>
(retract ?f)
(printout t "Enter the name of person that you want to modify" crlf)
(bind ?n (read))
(printout t " Enter new value" crlf)
(bind ?V (read))
(assert (modify-gender ?n ?V)))
(defrule ModifyGender-apply
?f <- (modify-gender ?n ?v)
?num <- (person (name ?n))
=>
(retract ?f)
(modify ?num (gender ?v)))
(defrule ModifyGender-don't-apply
?f <- (modify-gender ?n ?v)
(not (person (name ?n)))
=>
(retract ?f))
Or you can use the fact-set query functions to locate and change the person from the actions of the rule:
(defrule ModifyGender
?f <- (task type a)
=>
(retract ?f)
(printout t "Enter the name of person that you want to modify" crlf)
(bind ?n (read))
(printout t " Enter new value" crlf)
(bind ?V (read))
(if (any-factp ((?p person)) (eq ?p:name ?n))
then
(do-for-fact ((?p person)) (eq ?p:name ?n)
(modify ?p (gender ?V)))
else
(printout t "Person " ?n " does not exist." crlf)))

Resources