-1

PL ロジック リゾルバーに取り組んでおり、入力にスペースがないか、等間隔であることを確認する必要があります。スペースを削除する方が簡単だと思います。だから私は入力からスペースを削除する関数を書いています。

これまでのところ、私は持っています:

;sample input
(define KB&!alpha
  '((Girl)
    (~ Boy)
    (~~Boy)
    ( ~(FirstGrade ^ ~ ~ Girl))
    (Boy / Child)))

(define formatted null)

;formatting function
(define (Format_Spaces KB&!alpha)
  (for/list ((item KB&!alpha))
    (cond 
      ((list? item)(Format_Spaces item))
      ((not (eq? item " "))(set! formatted (append formatted (list item))))
      ((eq? item " ")(Format_Spaces (cdr KB&!alpha)))
    )
  )
)

しかし、それは明らかに間違った出力を与えています。

スペースがまだ残っているだけでなく、出力は入力の奇妙な組み合わせです。誰でもこれについて私を助けることができますか?

私はこのようなものを取得したい:

'((FirstGrade)
    (FirstGrade=>Child)
    (Child^Male=>Boy)
    (Kindergarten=>Child)
    (Child^Female=>Girl)
    (Female)))

読んでくれてありがとう。

編集:入力の形式を統一しようとしています。新しいサンプル入力では、(~~Boy) は 2 つの記号、(~~Boy) は 1 つの記号、(~~ Girl) は 3 つの記号として解析されます。これは解析が難しいと思います。特に、記号/演算子/スペースのさまざまなバリエーションがあります。(つまり、"Child^" は "Child"、"^"、または "Child^" 全体の記号として解析されますか?)

4

1 に答える 1

3

再編集:

以下のコメントに基づいて、実際にこのアルゴリズムを Racket で作成しようとしているように見えます。

その場合は、もっと簡単な処方箋があります。何もしないでください。特に、入力には現在スペースがまったく含まれていません。表示されるスペースは、Racket の表示メカニズムの一部として挿入されています。これは、データベース プリンターがコンマまたはタブで区切られたフィールドを印刷するのとほぼ同じ方法です。

カンマについて心配するよりも、解決アルゴリズムに注目してください。それは何を必要とし、何を生み出しますか?

于 2014-03-07T05:35:01.343 に答える