Клипы, передающие многозначную переменную в deffunction - PullRequest
0 голосов
/ 06 апреля 2019

В настоящее время я пишу программу, которая будет имитировать пропозициональные законы.Я получил функцию my-test, чтобы определить, присутствуют ли определенные символы в строке, и я работаю нормально, если я передаю только одну переменную слота, но он не принимает переменную с несколькими значениями.

У меня есть код, работающий, если передать, например, «sigle», но если я пытаюсь передать символ «$» в программу, он говорит, что он ожидает строку или символ.

(deftemplate sentence (multislot sent))

(defrule read-from-user
=>
(bind ?response "")
(printout t "Please enter a sentence: Use ~ for not and => for implies, or(v) and and(^) please. For predicates use { and } Example exists{richard}" crlf)
(bind ?response (explode$ (readline)))
(bind ?response (replace-member$ ?response "(" (sym-cat "(")))
(bind ?response (replace-member$ ?response ")" (sym-cat ")")))
(bind ?response (replace-member$ ?response "~" (sym-cat "~")))
(bind ?response (replace-member$ ?response "v" (sym-cat "v")))
(bind ?response (replace-member$ ?response "=>" (sym-cat "=>")))
(bind ?response (replace-member$ ?response "^" (sym-cat "^")))
(bind ?response (replace-member$ ?response "[" (sym-cat "[")))
(bind ?response (replace-member$ ?response "]" (sym-cat "]")))
(bind ?response (replace-member$ ?response "{" (sym-cat "{")))
(bind ?response (replace-member$ ?response "}" (sym-cat "}")))

(assert (sentence (sent ?response))))

(deffunction my-test ($?symbol) (not (or (str-index "^" ?symbol) (str-index "v" ?symbol)))) 

(defrule negative
(sentence (sent $?before "~" "(" "~" $?symbol ")" $?after))
(test (my-test $?symbol))
 =>
 (assert (sentence (sent $?before $?symbol $?after))))

(run)
Please enter a sentence: Use ~ for not and => for implies, or(v) and and(^) please. For predicates use { and } Example exists{richard}
~(~P v Q)
[ARGACCES2] Function 'str-index' expected argument #2 to be of type symbol, string, or instance name.
[PRCCODE4] Execution halted during the actions of deffunction 'my-test'.

Это ошибка, которую я получаю, когда запускаю программу, у меня возникает ощущение, что мне нужно сделать разговор, но я не совсем уверен, что именно нужно сделать.Спасибо за помощь

1 Ответ

0 голосов
/ 06 апреля 2019

Если вы передаете несколько символов в функцию my-test для проверки, вам нужно выполнить итерацию по ним, используя функцию foreach.

         CLIPS (6.31 4/1/19)
CLIPS> (deftemplate sentence (multislot sent))
CLIPS> 
(defrule read-from-user
   =>
   (bind ?response "")
   (printout t "Please enter a sentence: Use ~ for not and => for implies, or(v) and and(^) please. For predicates use { and } Example exists{richard}" crlf)
   (bind ?response (explode$ (readline)))
   (bind ?response (replace-member$ ?response "(" (sym-cat "(")))
   (bind ?response (replace-member$ ?response ")" (sym-cat ")")))
   (bind ?response (replace-member$ ?response "~" (sym-cat "~")))
   (bind ?response (replace-member$ ?response "v" (sym-cat "v")))
   (bind ?response (replace-member$ ?response "=>" (sym-cat "=>")))
   (bind ?response (replace-member$ ?response "^" (sym-cat "^")))
   (bind ?response (replace-member$ ?response "[" (sym-cat "[")))
   (bind ?response (replace-member$ ?response "]" (sym-cat "]")))
   (bind ?response (replace-member$ ?response "{" (sym-cat "{")))
   (bind ?response (replace-member$ ?response "}" (sym-cat "}")))
   (assert (sentence (sent ?response))))
CLIPS> 
(deffunction my-test (?symbols)
   (foreach ?s ?symbols 
      (if (or (str-index "^" ?s) (str-index "v" ?s))
         then (return FALSE)))
   (return TRUE)) 
CLIPS> 
(defrule negative
   (sentence (sent $?before "~" "(" "~" $?symbol ")" $?after))
   (test (my-test $?symbol))
    =>
    (assert (sentence (sent $?before $?symbol $?after))))
CLIPS> (run)
Please enter a sentence: Use ~ for not and => for implies, or(v) and and(^) please. For predicates use { and } Example exists{richard}
~(~P v Q)
CLIPS>
...