2015-02-20 4 views
0
(define(app list1 list2) 
    (if(empty? list1) list2 
    (cons (car list1) (app(cdr list1)list2)))) 

(app ((list "↔" "→" "∧" "⊕" "∨" "¬")) (list "P" "Q" "R" "S" "U" "X" "Y" "Z")) 




(define L (list "↔" "→" "∧" "⊕" "∨" "¬")) 
(define (f L n) 
    (if (= n 0) "p" 
     (string-append "p" (car L) (f(cdr L) (- n 1))))) 

(f L 3) 

Вы имеете следующее рекурсивное определение Предложение:рекурсивное определение пропозиции

  1. T, F являются предложения (значение истинности пропозициональных переменных)
  2. Список пункт
  3. Пропозициональные буквы P , Q, R, S, U, X, Y, Z являются предложениями.
  4. Если A - предложение, то ¬A является предложением.
  5. Если A и B являются предложениями, то A⊕B, A → B, A∧B, A∨B, A↔B являются предложениями.

Напишите процедуру DrRacket, которая будет произвольно генерировать предложение с заданным количеством операций.

Я не мог выполнить функцию. Не могли бы вы мне помочь?

ответ

3

Поскольку этот вопрос является домашним заданием, я покажу вам технику, используя другой пример. Следующая грамматика имеет два нетерминала S и T. Для каждого нетерминального я определил функцию, которая генерирует случайную строку в соответствии с правилами. Поскольку S имеет четыре правила, я выбираю одно из правил наугад.

#lang racket 

;;; Grammar 

; The grammar has two non-terminals S and T. 
; There are four rules for S and one for T. 

; S -> aSa 
; S -> bSb 
; S -> cT 
; S -> ε 

; T -> dS 

(define (S) 
    (case (random 4) ; random number 0,1,2,3 (four rules for S) 
    [(0) (string-append "a" (S) "a")] 
    [(1) (string-append "b" (S) "b")] 
    [(2) (string-append "c" (T))] 
    [(3) ""])) 

(define (T) 
    ; only one rule, so no need for random here 
    (string-append "d" (S))) 

; generate a random string according to the grammar 
(S) 

Некоторые примеры выхода:

"bb" 
"bbcdbcdbbb" 
"cdbb" 
+0

Вы должны сделать перестановки этих списков. Каждое из предложений «P Q R ...» должно быть переписано с помощью другого из «P Q R ...», помещая между ними логический оператор. Пример 'P^Q'' P v Q'' ~ P^Q' и т. Д. Это можно сделать с помощью [map] (http://docs.racket-lang.org/reference/pairs.html?q=map#%28def._%28%28lib._racket%2Fprivate%2Fmap..rkt%29 ._map% 29% 29). –

Смежные вопросы