Aqui está o resumo do erro:
CLIPS> (load "C:/Users/labor/Desktop/Witek/projekt.CLP")
Defining defrule: R1 +j+j
Defining defrule: R2 +j+j
Defining defrule: R3 =j+j+j
Defining defrule: imie-if =j=j+j+j
[CSTRCPSR1] Expected the beginning of a construct.
E aqui está o código do meu programa CLIPS. Basicamente, quero que reaja de forma diferente se o nome e o sobrenome forem diferentes de Abraham Lincoln.
(defrule R1
(initial-fact)
=>
(printout t "Enter your name:" crlf)
(bind ?name (read))
(assert (name ?name)))
(defrule R2
(name ?name)
=>
(printout t "Enter your last name" crlf)
(bind ?lastnm (read))
(assert (lastnm ?lastnm)))
(defrule R3
(and(name ?name)(lastnm ?lastnm))
=>
(printout t "How old are you " ?name "?" crlf)
(bind ?age (read))
(assert (age ?age)))
(defrule name-if
(name ?name)(lastnm ?lastnm)(age ?age)
=>
(if(and(eq ?name Abraham)(eq ?lastnm Lincoln))
then (printout t "Hello " ?name " " ?lastnm ", you are " ?age " years old bro" crlf))
else (printout t "Hello " ?name " " ?lastnm ", you are " ?age " years old" crlf)))
Eu copiei a lógica da declaração if de alguma página da web e não tenho certeza do que, nesse caso, "eq" significa ... eu agradeceria se você pudesse explicar adicionalmente o papel dela.
Saudações, W
Respostas:
0 para resposta № 1Você tem um parêntese extra à direita no final doa cláusula then que está causando o problema. Os IDEs do Mac OS e do Window CLIPS têm um comando de equilíbrio que você pode usar para ver se os parênteses estão adequadamente equilibrados em uma construção. Basta clicar dentro de uma construção e aplicar o comando balance várias vezes até que toda a construção seja selecionada. Se você posicionar o cursor pela palavra-chave e equilíbrio, verá que a instrução if é fechada pelos parênteses no final da cláusula then e a cláusula else permanece pendente.
A regra corrigida é:
(defrule name-if
(name ?name)
(lastnm ?lastnm)
(age ?age)
=>
(if (and (eq ?name Abraham)
(eq ?lastnm Lincoln))
then
(printout t "Hello" ?name " " ?lastnm ", you are " ?age " years old bro" crlf)
else
(printout t "Hello " ?name " " ?lastnm ", you are " ?age " years old" crlf)))
O predicado eq é curto para iguais. Ao contrário do predicado = que espera argumentos numéricos, o eq compara valores de qualquer tipo.