Клипы взрываются $ не работает должным образом при получении ввода от пользователя - PullRequest
0 голосов
/ 29 марта 2019

Привет, я написал дефруле, которая, как предполагается, имитирует пропозициональный закон, но дефруле не срабатывает, когда я даю ему правильный ввод.

Я полагаю, что $ Explode может добавлять пробелы, но я не уверен, как их удалить

     CLIPS (Cypher Beta 8/21/18)
CLIPS> (batch "AI taak.txt")
TRUE
CLIPS> (deftemplate andprop (slot symbol1)(slot symbol2))
CLIPS> (deftemplate orprop (slot symbol1)(slot symbol2))
CLIPS> (deftemplate implies (multislot premise)(multislot implication))
CLIPS> (deftemplate sentence (multislot sent))
CLIPS> 
(defrule read-from-user
=>
(printout t "Please enter a sentence: Use ~ for not and => for implies 
please " crlf)
 (bind ?response (explode$ (readline)))
(assert (sentence (sent ?response))))
CLIPS> 
(defrule negative
(sentence (sent "~" "(" "~" ?symbol ")"))
 =>
   (printout t "HI " ?symbol crlf))
CLIPS> (run)
Please enter a sentence: Use ~ for not and => for implies please 
~(~P)
CLIPS> (facts)
f-1     (sentence (sent ~ ( ~ P )))
For a total of 1 fact.

Так что теоретически отрицательное правило должно срабатывать, но это не #. Помощь в выяснении, почему будет оценено. ТНХ

1 Ответ

0 голосов
/ 29 марта 2019

Поведение функции explode $ было изменено в 6.4 для токенов, которые обычно действуют как разделители для преобразования их в символы, а не в строки.Это было сделано для того, чтобы при взрыве строки и последующем внедрении результата получалась строка без дополнительных кавычек.

Это то, что раньше происходило с 6.3:

         CLIPS (6.31 2/3/18)
CLIPS> (implode$ (explode$ "~(~P)"))
""~" "(" "~" P ")""
CLIPS> 

И это то, что происходит с6.4:

         CLIPS (Cypher Beta 8/21/18)
CLIPS> (implode$ (explode$ "~(~P)"))
"~ ( ~ P )"
CLIPS> 

Вы можете получить ранее полученные результаты, используя функцию $ replace-member в правиле чтения от пользователя, чтобы заменить символы на строки:

         CLIPS (Cypher Beta 8/21/18)
CLIPS> (deftemplate sentence (multislot sent))
CLIPS> 
(defrule read-from-user
   =>
   (printout t "Please enter a sentence: Use ~ for not and => for implies please " 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 "~")))
   (assert (sentence (sent ?response))))
CLIPS> (run)
Please enter a sentence: Use ~ for not and => for implies please 
~(~P)
CLIPS> (facts)
f-1     (sentence (sent "~" "(" "~" P ")"))
For a total of 1 fact.
CLIPS> 
...