CLIPS Validate Text Entry

笑着哭i 提交于 2019-12-12 01:32:45

问题


Morning, Excuse the silly question but I am busy building a expert system much like the "21 Questions" game that uses questions asked to the user in order to determine the right dog for them. The expert system is coded in CLIPS / .CPS language and one of the requirements I am looking to include is that when the user is asked a yes/no question they are required to input "y" or "n".

In all the resources we have been taught we have only been tough number validation and not a specific character validation and I cannot find any resources that do this either.

This is an example of the number validation I did in order to ensure they input a valid number on one of my questions

(defrule test-integer
(number-in ?number&:(integerp ?number))
=>
(printout t ?number "is valid"

(defrule test-non-int
?number-address <- (number-in ?number&:(not (integerp ?number)))
=>
(printout t ?number " not valid int" crlf)
(retract ?number-address))

回答1:


This is how you'd do it using rules:

CLIPS> 
(defrule test-response
   (response-in ?response&y|n)
   =>
   (printout t ?response " is valid" crlf))
CLIPS> 
(defrule test-non-response
   ?response-address <- (response-in ?response&~y&~n) 
   =>
   (printout t ?response " not valid response" crlf)
   (retract ?response-address))
CLIPS> (assert (response-in xyz))
<Fact-1>
CLIPS> (run)
xyz not valid response
CLIPS> (assert (response-in n))
<Fact-2>
CLIPS> (run)
n is valid
CLIPS>

I'd suggest using a function that only accepts correct responses:

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> (ask-question "Continue? " y n yes no)
Continue? k
Continue? l
Continue? ye
Continue? YeS
yes
CLIPS> 



回答2:


What i figured out was to link the answer from the one defrule to that of another defrule first to check if the answer was valid and then again if that answer was valid to link it to the correct defrule then that will proceed with the next question.

Code is from my own Expert System:

 (defrule Small-CoatType-Full
 (Small-Coat f)
 (person (name ?name))
  =>
(open "result.txt" result "a")
(printout result ?name " Likes Smaller, Fury Dogs" crlf)
(close result)
(printout t "Would you like a low energetic(l) or high energetic(h) breed?" crlf)
(assert (Small-Energy-Level(lowcase(read)))))

(defrule Small-Energy-Level-Wrong
(Small-Energy-Level ?var &~l&~h)
=>
(printout t crlf "Plesae Only Choose (l) or (h)")
(assert (Small-Energy-Level (lowcase(read)))))`


来源:https://stackoverflow.com/questions/23801964/clips-validate-text-entry

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!