All pastes #383117 Raw Edit

Untitled

public text v1 · immutable
·published 2007-03-06 03:23 UTC
rendered paste body
;; ** PCS-2046 - Logica Computacional **
;; Prof. Ricardo Luis de Azevedo da Rocha
;;
;; ** Coop 7 **
;; Adriana Haseyama - NUSP 3455942
;; Kenzo Okamura - NUSP 2937134
;;
;; ** Primeiro Exercicio-Programa - EP 1 **
;; = Item 1 =
;; Construa uma funcao em Scheme que permita percorrer
;; um conjunto recursivamente (recebido em uma lista) e,
;; a cada recurso, retorne um dos elementos do conjunto.

(define recursiva
  (lambda (lista)
    (begin
      (when (> (length lista) 0)
	  (display (car lista))
	  (newline)
	  (recursiva (cdr lista))
;	  (car lista)
	  ))))

;; Teste:
;;(recursiva (list 1 2 3 4 5 10 9 8 7 6))

;; = Item 2 =
;; Construa uma funcao em Scheme que permita a geracao de cadeias
;; (incluindo formas sentenciais e sentencas) em ordem de tamanho. A
;; sua funcao deve receber as regras de uma gramatica de estrutura de
;; frase, recursiva, e deve solicitar um valor de tamanho para as
;; cadeias.
;; A partir destes dados a sua funcao devera gerar todas as cadeias
;; cujos tamanhos sejam menores ou iguais ao valor recebido.
;; (use a funcao do item anterior como apoio)

;; Gramatica G=(V, T, P, S)
;; V = Lista de simbolos nao terminais
;; T = Lista de simbolos terminais
;; P = Lista de pares indicando regra de producao
;; S = Variavel inicial

(define V
  (list "S" "B"))
(define T
  (list "a" "b"))
(define P
  (list
   (cons "S" "aS")
   (cons "S" "B")
   (cons "B" "bB")
   (cons "B" "")))

(require (lib "list.ss"))

(define gera-cadeias
  (lambda (V T P S tamanho)
    (let ((regras (ordena-regra-decrescente P))
	  (nova-cadeia "") (lista-saida '()))
      
      (let iterator ((i 0))
	(when (and
	       (< i (length regras))
	       (<= (tamanho-cadeia-terminais S V) tamanho))
	  (begin
	    (let* ((regra (list-ref regras i))
		   (esquerda-regra (car regra))
		   (direita-regra (cdr regra)))
	      
	      (begin
		(when (regexp-match esquerda-regra S)
		  
		  (begin
		    (set! nova-cadeia
		     (regexp-replace
		      esquerda-regra
		      S
		      direita-regra))
		    
		    ;(debug-transformacao
		    ; S
		    ; esquerda-regra
		    ; direita-regra
		    ; nova-cadeia)
		    
		    (if (contem-nao-terminais? nova-cadeia V)
			(set! lista-saida
			      (append lista-saida
				      (gera-cadeias
				       V T regras nova-cadeia tamanho)))
			(begin
			  ;(display
			  ; (string-append
			  ;  "*** FINAL: "
			  ;  nova-cadeia
			  ;  " ***"))
			  
			  (set! lista-saida
				(append lista-saida
					(list nova-cadeia)))
			  ;(display lista-saida)
			  ))
		    ))))
	    
	    (iterator (+ i 1))
	    
	    )))
      (sort lista-saida compara-tamanho-cadeia)
      )))

(define tamanho-cadeia-terminais
  (lambda (cadeia lista-nao-terminais)
    (let iterator ((i 0))
      (when (< i (length lista-nao-terminais))
	(set! cadeia
	      (regexp-replace*
	       (list-ref lista-nao-terminais i) cadeia ""))
	(iterator (+ i 1))))
    (string-length cadeia)))

(define compara-tamanho
  (lambda (arg1 arg2)
    (if (> (string-length (car arg1)) (string-length (car arg2)))
	#t
	#f)))

(define compara-tamanho-cadeia
  (lambda (arg1 arg2)
    (if (> (string-length arg1) (string-length arg2))
	#f
	(begin
	  (if (= (string-length arg1) (string-length arg2))
	      (begin
		(if (string>? arg1 arg2)
		    #f
		    #t))
	      #t)))))

(define ordena-regra-decrescente
  (lambda (lista)
    (sort lista compara-tamanho)))

(define contem-nao-terminais?
  (lambda (cadeia lista-nao-terminais)
    (let ((encontrado #f))
      (let iterator ((i 0))
	(when (< i (length lista-nao-terminais))
	  (when (not encontrado)
	    (if (regexp-match (list-ref lista-nao-terminais i) cadeia)
		(begin
		  (set! encontrado #t)
		  (set! iterator (length lista-nao-terminais)))
		(iterator (+ i 1)))))
	encontrado
	))))

(define debug-transformacao
  (lambda (antes esquerda direita depois)
    (display
     (string-append
      "[" antes " (" esquerda " -> " direita " == " depois ")]"))
    (newline)))


;; Item 3
;; Construa um sistema em Scheme que implemente o algoritmo de
;; reconhecimento de cadeias a partir de uma determinada gramatica.
;; O seu sistema devera utilizar a funcao desenvolvida no item anterior.

(define reconhece-cadeia
  (lambda (cadeia V T P S tamanho)
    (let ((encontrado #f)
	  (cadeias-validas (gera-cadeias V T P S tamanho)))
      (let iterator ((i 0))
	(when (< i (length cadeias-validas))
	  (when (string=? cadeia (list-ref cadeias-validas i))
	    (set! encontrado #t)
	    (set! i (length cadeias-validas)))
	    
	  (iterator (+ i 1))
	  encontrado)))))