#string-matching #clips
#сопоставление строк #клипы
Вопрос:
Привет, я пишу программу, которая будет имитировать пропозициональные законы. Я хотел бы убедиться, что определенные символы не содержатся в моих переменных. Есть ли простая функция для этого.
В настоящее время у меня это работает, если моя переменная состоит только из одного символа, но я хотел бы заставить ее работать с переменной с несколькими слотами.
(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))))
(defrule negative
(sentence (sent $?before "~" "(" "~" ?symbol ")" $?after))
(test (neq ?symbol "~" "(" ")" "=" "^" "v"))
=>
(assert (sentence (sent $?before $?symbol $?after))))
Этот фрагмент кода работает для отдельных символов, но я знаю, что сделать
?Символ в символ $? и по-прежнему проверяйте, что ни один из символов (,), ~, = и т.д. Не находится в символе ?$.
Итак, если есть какая-либо похожая функция для сравнения в C #, могу ли я ее использовать? спасибо, ребята
Ответ №1:
Используйте функцию str-index, чтобы определить, содержится ли последовательность символов в строке:
CLIPS (6.31 4/4/19)
CLIPS> (str-index "^" "abc")
FALSE
CLIPS> (str-index "^" "ab^c")
3
CLIPS>
Комментарии:
1. У меня просто есть один рудный вопрос, как бы я написал функцию для тестирования всех тех строк, которые я упомянул выше? В противном случае мне придется проверять наличие всех этих строк по всем моим правилам, и это было бы отстойно, так что, возможно, я мог бы создать функцию для этого и просто вызвать эту функцию?
2. (функция my-test (?символ) (не (или (str-индекс «^» ?символ) (str-индекс «v» ?символ))))
3. Это идеально, но я не могу передать переменную $? этой функции. В нем говорится, что ожидается строка или synbol. Какую cionversion я должен выполнить для a $? переменная, чтобы иметь возможность передавать ее в дефункцию? Большое вам спасибо за вашу помощь в последние несколько дней, Гэри 🙂