Racket 的示例输入和输出

Example input and output for Racket

我不想帮助解决这个问题,但我想确切地知道它在问什么。为了更好地理解它的要求,我想问是否有人可以向我提供示例输入及其相应的输出。

Write and certify a recursive procedure check which inputs an sexp s 
and a list varlst
of identifiers and decides whether s belongs to the class of fully
parenthesized infix +-expressions fpip defined as follows:

var ::=  a | b | c | d | e | f | g
fpip ::= var | (fpip + fpip)

有效 "fpip" 表达式的示例:

a 
(a + b)
((a + b) + (c + d))

解释: 第一个定义 "var" 告诉你它可以是符号 a ... g 之一。 第二个定义 "fpip" 告诉您有 "var" 或 (fpip + fpip) 的复合表达式。因此,这意味着 a 是有效的 "fpip",因为 a 是有效的 "var"。这也意味着 (a + b) 是有效的 "fpip"。通过在复合表达式中使用 "fpip" 代替 "var" 得到的是嵌套,如有效的 "fpip" ((a + b) + (c + d)).

作为提示。您的程序将反映定义。它将检查参数是否为 var,如果不是,它需要检查它是否像第二个定义,其中包括两次递归调用以检查每个部分是否也有效。

没有很好解释的是varlist的目的。我想它代表分配的变量并且 "var" 不仅需要 a ... g 才有效,而且标识符也存在于 varlist 中它是有效的。这是一个有根据的猜测,因为我已经分享了我的口译员,但我认为应该更清楚地说明它。例如。也许:

(fpip? 'c '(b a q)) ; ==> #f (c is in "var" definition but not in varlist)
(fpip? 'a '(b a q)) ; ==> #t (a is in "var" definition and in varlist)
(fpip? 'q '(b a q)) ; ==> #f (q is not in "var" definition)