КЛИПЫ Я хотел бы сгруппировать свои слоты, прежде чем утверждать новый факт с помощью Implod $ - PullRequest
0 голосов
/ 31 марта 2019

Привет, я написал программу, которая будет имитировать пропозициональные законы, используя explode $, чтобы разбить все мои символы на разные слоты.Теперь я хотел бы снова объединить их, прежде чем констатировать факт.

Я пытался использовать имплозу, но не совсем уверен, где ее поставить.

(deftemplate sentence (multislot sent))

(defrule read-from-user
 =>
(printout t "Please enter a sentence: Use ~ for not and => for implies, or(v) and and(^) 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 "~")))
(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 "v" (sym-cat "v")))
(assert (sentence (sent ?response))))

(defrule or-to-implies
(sentence (sent $?before "(" ?symbolone "v" ?symboltwo ")" $?after))
 =>
(assert (sentence (sent $?before "(" "~" ?symbolone "=>" ?symboltwo ")" $?after))))

Это мой текущий вывод при вводе (PVQ)

Please enter a sentence: Use ~ for not and => for implies, or(v) and and(^) 
(P v Q)
CLIPS> (facts)
f-1     (sentence (sent "(" P "v" Q ")"))
f-2     (sentence (sent "(" "~" P "=>" Q ")"))

но я бы хотел, чтобы мой вывод читался (предложение (отправлено "(~ P => Q)")) или что-то подобное, спасибо всем

1 Ответ

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

Преобразование обратно в исходное предложение с помощью implode $ требует как создания одного значения мультиполя, так и преобразования строк обратно в символы.Функция apply в следующем коде сделает это:

         CLIPS (6.31 2/3/18)
CLIPS> 
(deffunction apply (?func $?list)
   (bind ?rv (create$))
   (foreach ?l ?list
      (bind ?rv (create$ ?rv (funcall ?func ?l))))
   ?rv)
CLIPS> 
(deftemplate sentence (multislot sent))
CLIPS> 
(defrule read-from-user
   =>
   (printout t "Please enter a sentence: Use ~ for not and => for implies, or(v) and and(^) 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 "~")))
   (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 "v" (sym-cat "v")))
   (assert (sentence (sent ?response))))
CLIPS> 
(defrule or-to-implies
   (sentence (sent $?before "(" ?symbolone "v" ?symboltwo ")" $?after))
    =>
   (assert 
      (sentence 
         (sent (implode$ 
                  (apply sym-cat $?before 
                                 "(" "~" ?symbolone "=>" ?symboltwo ")" 
                                 $?after))))))
CLIPS> (run)
Please enter a sentence: Use ~ for not and => for implies, or(v) and and(^) please 
(P v Q)
CLIPS> (facts)
f-0     (initial-fact)
f-1     (sentence (sent "(" P "v" Q ")"))
f-2     (sentence (sent "( ~ P => Q )"))
For a total of 3 facts.
CLIPS> (reset)
CLIPS> (run)
Please enter a sentence: Use ~ for not and => for implies, or(v) and and(^) please 
M ^ (P v Q) ^ R
CLIPS> (facts)
f-0     (initial-fact)
f-1     (sentence (sent M "^" "(" P "v" Q ")" "^" R))
f-2     (sentence (sent "M ^ ( ~ P => Q ) ^ R"))
For a total of 3 facts.
CLIPS> 
...