git.fiddlerwoaroof.com
Raw Blame History
;;; Sample OPS5 program: Automobile diagnosis
;;; Provided by Michael Mauldin, mlm@cs.cmu.edu.

(reset-ops)

(watch 0)
(strategy lex)

(literalize task
	goal)			; Task name

(literalize fact
	name			; Question to ask user [Y/N]
	value)			; Answer to question

(p start
    (ready)
    -->
    (Remove 1)
    (make task ^goal start)
    (write (crlf) (crlf) "Automobile Diagnosis" (crlf) (crlf)))

(p initialize
    (task ^goal start)
    -->
    (modify 1 ^goal diagnose)
    (make fact ^name |spark at spark plugs|)
    (make fact ^name |carburetor smells like gasoline|)
    (make fact ^name |fuel gauge shows empty|)
    (make fact ^name |headlights are dim or dead|)
    (make fact ^name |engine is turning|)
    (make fact ^name |key is off|))

;;; ask-user: Ask the user about a fact

(p ask-user
    (task ^goal diagnose)
    (fact ^name <name> ^value nil)
    -->
    (write (crlf) "Is this true:" <name> "[no] ")
    (bind <input> (acceptline no))
    (modify 2 ^value <input>))

;;; make-yes-answer: Force a yes answer to be 'yes'

(p make-yes-answer
    (task ^goal diagnose)
    (fact ^value << y >>)
    -->
    (modify 2 ^value yes))

;;; make-no-answer: Force a no answer to be 'no'

(p make-no-answer
    (task ^goal diagnose)
    (fact ^value << n >>)
    -->
    (modify 2 ^value no))

;;; force-yes-or-no: Wipe out bad answers

(p force-yes-answer
    (task ^goal diagnose)
    (fact ^value {<> nil <> yes <> y <> no <> n <> q <> quit})
    -->
    (write (crlf) "Please answer yes or no")
    (modify 2 ^value nil))

;;; quit: Quit

(p quit
    (task ^goal diagnose)
    (fact ^value << q quit >>)
    -->
    (halt))

(p key-is-off
    (task ^goal diagnose)
    (fact ^name |key is off| ^value yes)
    -->
    (bind <x> |you must turn the key to start the car|)
    (make fact ^name <x> ^value yes)
    (write (crlf) "Concluding" <x> (crlf))
    (modify 1 ^goal clean))

(p ignition-or-fuel
    (task ^goal diagnose)
    (fact ^name |key is off| ^value no)
    (fact ^name |engine is turning| ^value yes)
    -->
    (bind <x> |problem is in fuel or ignition system|)
    (make fact ^name <x> ^value yes)
    (write (crlf) "Concluding" <x> (crlf)))

(p bad-starting-system
    (task ^goal diagnose)
    (fact ^name |key is off| ^value no)
    (fact ^name |engine is turning| ^value no)
    -->
    (bind <x> |problem is in starting system|)
    (make fact ^name <x> ^value yes)
    (write (crlf) "Concluding" <x> (crlf)))

(p out-of-gas
    (task ^goal diagnose)
    (fact ^name |fuel gauge shows empty| ^value yes)
    -->
    (bind <x> |out of gas|)
    (make fact ^name <x> ^value yes)
    (write (crlf) "Concluding" <x> (crlf))
    (modify 1 ^goal clean))

(p engine-flooded
    (task ^goal diagnose)
    (fact ^name |problem is in fuel or ignition system| ^value yes)
    (fact ^name |carburetor smells like gasoline| ^value yes)
    (fact ^name |spark at spark plugs| ^value yes)
    -->
    (bind <x> |engine is flooded: wait 15 minutes|)
    (make fact ^name <x> ^value yes)
    (write (crlf) "Concluding" <x> (crlf))
    (modify 1 ^goal clean))

(p bad-ignition
    (task ^goal diagnose)
    (fact ^name |problem is in fuel or ignition system| ^value yes)
    (fact ^name |headlights are dim or dead| ^value no)
    (fact ^name |spark at spark plugs| ^value no)
    -->
    (bind <x> |you have a bad ignition system|)
    (make fact ^name <x> ^value yes)
    (write (crlf) "Concluding" <x> (crlf))
    (modify 1 ^goal clean))

(p bad-battery
    (task ^goal diagnose)
    (fact ^name |headlights are dim or dead| ^value yes)
    -->
    (bind <x> |you have a dead battery|)
    (make fact ^name <x> ^value yes)
    (write (crlf) "Concluding" <x> (crlf))
    (modify 1 ^goal clean))

(p bad-starter
    (task ^goal diagnose)
    (fact ^name |problem is in starting system| ^value yes)
    (fact ^name |headlights are dim or dead| ^value no)
    -->
    (bind <x> |you have a bad starter|)
    (make fact ^name <x> ^value yes)
    (write (crlf) "Concluding" <x> (crlf))
    (modify 1 ^goal clean))

(p bad-fuel-pump
    (task ^goal diagnose)
    (fact ^name |problem is in fuel or ignition system| ^value yes)
    (fact ^name |carburetor smells like gasoline| ^value no)
    (fact ^name |fuel gauge shows empty| ^value no)
    -->
    (bind <x> |problem in fuel system: bad fuel pump or filter|)
    (make fact ^name <x> ^value yes)
    (write (crlf) "Concluding" <x> (crlf))
    (modify 1 ^goal clean))

(p clean-up-old-fact
    (task ^goal clean)
    (fact)
    -->
    (Remove 2))

(p done-cleaning
    (task ^goal clean)
   -(fact)
    -->
    (modify 1 ^goal start)
    (write "*End of diagnosis*" (crlf) (crlf)))