Acho que o seu problema mesmo é ter perdido a prática com Lisp. Clisp
na verdade é apenas uma implementação de Common Lisp (CL), que é uma
linguagem muito robusta - tem muitas funções, acredito que tenha bem
mais do que você precisa para traduzir o seu programa, mesmo porque
mulisp é minimalista. Fazendo um pouco de pesquisa me leva a acreditar
que mulisp mesmo é um Lisp que implementa várias funções de Common
Lisp, mas ainda não havia o padrão ANSI Common Lisp.

Olhando o seu código meio por cima, me parece que o problema é apenas
uma questão de sintaxe. Por exemplo, isto:

(DEFUN P-LIVRE (x FORMULA y A)
   ((OR (CASA FORMULA '(QS y A))
         (CASA FORMULA '(EX y A)))
      (SETQ A (THIRD    FORMULA))
      (SETQ y (SECOND FORMULA))
      (AND (NEQ x y) (P-LIVRE x A)))
   ((OR (CASA FORMULA '(A eq B))
         (CASA FORMULA '(A ent B))
         (CASA FORMULA '(A e   B))
         (CASA FORMULA '(A ou  B)))
      (OR (P-LIVRE x (CAR FORMULA)) (P-LIVRE x (CADDR FORMULA))))
   ((OR (CASA FORMULA '(nf A))
         (CASA FORMULA '(co A))
         (CASA FORMULA '(n  A)))
      (P-LIVRE x (CADR FORMULA)))
   ((MEMBER x FORMULA) 'T))

Não faz nenhum sentido em CL. Acredito que a tradução deste pedaço de
código seria apenas colocar um cond ao redor do corpo da função:

(DEFUN P-LIVRE (x FORMULA y A)
  (cond
   ((OR (CASA FORMULA '(QS y A))
        (CASA FORMULA '(EX y A)))
    (SETQ A (THIRD    FORMULA))
    (SETQ y (SECOND FORMULA))
    (AND (NEQ x y) (P-LIVRE x A)))
   ((OR (CASA FORMULA '(A eq B))
        (CASA FORMULA '(A ent B))
        (CASA FORMULA '(A e   B))
        (CASA FORMULA '(A ou  B)))
    (OR (P-LIVRE x (CAR FORMULA)) (P-LIVRE x (CADDR FORMULA))))
   ((OR (CASA FORMULA '(nf A))
        (CASA FORMULA '(co A))
        (CASA FORMULA '(n  A)))
    (P-LIVRE x (CADR FORMULA)))
   ((MEMBER x FORMULA) 'T))))

Tanto faz se cond é escrito em maiúsculas ou minúsculas, porque CL é
insensitivo à maiúsculas. Por outro lado, este loop

   (LOOP
      ((NULL PILHA) 'raiz-insatisfativel)
      ((EQL  (PROCESSE NO) 'satisfativel) 'raiz-satisfativel)
      (SETQ PILHA (APPEND (GET NO 'FILHOS) (CDR PILHA)))
      (PRINT PILHA)
      (SETQ NO (CAR PILHA))
   )

pode ser traduzido em algo usando do

   (do ((pilha pilha (append (get no 'filhos) (cdr pilha)))
        (no (car pilha)))
       ((null pilha )'raiz-insatisfativel)
     (if (eql  (processe no) 'satisfativel)
         (return 'raiz-satisfativel))

ou, se você não se importar com legibilidade, ou que o código fique
"da maneira correta", mas quiser apenas traduzir tudo de maneira
prática, pode fazer assim:

   (loop do
      (cond
       ((NULL PILHA) (return 'raiz-insatisfativel))
       ((EQL  (PROCESSE NO) 'satisfativel) (return 'raiz-
satisfativel)))
      (SETQ PILHA (APPEND (GET NO 'FILHOS) (CDR PILHA)))
      (PRINT PILHA)
      (SETQ NO (CAR PILHA))
   )

Outro problema são as variáveis. Elas não estão declaradas. Por
exemplo, naquele loop acima você chama (setq pilha alguma-coisa), mas
pilha não está declarada como uma variável local (usando let) nem
global (usando defvar). Talvez seu programa funcione se você deixar
assim mesmo, provavelmente o Clisp vai tratar a variável pilha como se
fosse global, mas isso em geral não é uma boa prática, e talvez não
funcione em outras implementações de CL.

Agora, acredito que esta seja a dica mais valiosa: vá traduzindo e
testando função por função, a começar pelas mais básicas. Não queira
traduzir tudo de uma só vez. Acho que o mais difícil vai ser achar
essas funções mais básicas e ir testando elas. Qualquer dificuldade,
estamos sempre por aqui :-)
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lisp-br" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/lisp-br?hl=en
-~----------~----~----~----~------~----~------~--~---

Responder a