/ / CLIPS - se a função else else fornecer [CSTRCPSR1] err - if-statement, clips

CLIPS - se a função else else fornecer [CSTRCPSR1] err - if-statement, clips

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 № 1

Você 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.

insira a descrição da imagem aqui

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.