2016-10-25 2 views
0

私はRacketのNLPプロジェクトに取り組んでいます。このラケットコードでtraceを使用するには?

このコードは正常に動作します。しかし、私はそれを辿ることができればと思います。

私はgenerate-next関数の動作をトレースするのに問題があります。

私のコードです:

#lang racket 

(require racket/trace) 

(require rackunit) 

(define english-1 
    '((Initial (1)) 
    (Final (9)) 
    (From 1 to 1 by NP) 
    (From 1 to 2 by DET) 
    (From 1 to 3 by NP) 
    (From 2 to 3 by N) 
    (From 3 to 4 by BV) 
    (From 4 to 5 by ADV) 
    (From 4 to 5 by |#|) 
    (From 5 to 6 by DET) 
    (From 5 to 7 by DET) 
    (From 5 to 8 by |#|) 
    (From 6 to 7 by ADJ)  
    (From 6 to 6 by MOD) 
    (From 7 to 9 by N) 
    (From 8 to 8 by MOD) 
    (From 8 to 9 by ADJ) 
    (From 9 to 4 by CNJ) 
    (From 9 to 1 by CNJ) 
    (From 9 to 2 by CNJ) 
    (From 9 to 3 by CNJ) 
    (From 9 to 6 by CNJ))) 

(define (getf x y) 
    (if (eq? (car x) y) 
     (cadr x) 
     (getf (cdr x) y))) 

(define (initial-nodes network) 
    (list-ref (assoc 'Initial network) 1)) 

(define (final-nodes network) 
    (list-ref (assoc 'Final network) 1)) 

(define (transitions network) 
    (filter (lambda (x) (eq? (car x) 'From)) network)) 

(define (trans-node transition) 
    (getf transition 'From)) 

(define(trans-newnode transition) 
    (getf transition 'to)) 

(define (trans-label transition) 
    (getf transition 'by)) 

(define abbreviations 
    '((NP kim sandy lee) 
    (DET a the her) 
    (N consumer man woman) 
    (BV is was) 
    (CNJ and or) 
    (ADJ happy stupid) 
    (MOD very) 
    (ADV often always sometimes))) 

(define (recognize network tape) 
    ;; returns t if sucessfully recognizes tape - nil otherwise 
    (call/cc (lambda (return) 
      (define (recognize-next node tape network) 
       (if (null? tape) 
        (if (member node (final-nodes network)) 
         (return #t) 
         (return '())); success 
        (for ([transition (transitions network)]) 
          ;; try each transition of the network 
          (when (equal? node (trans-node transition)) ; if it starts at the right node 
           (for ([newtape (recognize-move (trans-label transition) tape)]) 
             ;; try each possible new value of tape 
           (recognize-next (trans-newnode transition) newtape network)))))(trace recognize-next)) 
      (for ([initialnode (initial-nodes network)]) 
       (recognize-next initialnode tape network)) 
      null))) ; failed to recognize 

(define (recognize-move label tape) 
    (if (or (eq? label (car tape)) 
      (member (car tape) (or (assoc label abbreviations) '()))) 
     (list (cdr tape)) 
     (if (eq? label '|#|) 
      (list tape) 
      null))) 

私が呼ぶとき:

(recognize english-1 '(sandy is a happy woman)) 

トレースが正常に動作し、私が予想される出力があります何かを追跡しようとしたとき、しかし

>(recognize-next 
    3 
    '(is a happy woman) 
    '((Initial (1)) 
    (Final (9)) 
    (From 1 to 1 by NP) 
    (From 1 to 2 by DET) 
    (From 1 to 3 by NP) 
    (From 2 to 3 by N) 
    (From 3 to 4 by BV) 
    (From 4 to 5 by ADV) 
    (From 4 to 5 by |#|) 
    (From 5 to 6 by DET) 
    (From 5 to 7 by DET) 
    (From 5 to 8 by |#|) 
    (From 6 to 7 by ADJ) 
    (From 6 to 6 by MOD) 
    (From 7 to 9 by N) 
    (From 8 to 8 by MOD) 
    (From 8 to 9 by ADJ) 
    (From 9 to 4 by CNJ) 
    (From 9 to 1 by CNJ) 
    (From 9 to 2 by CNJ) 
    (From 9 to 3 by CNJ) 
    (From 9 to 6 by CNJ))) 
> (recognize-next 
    4 
    '(a happy woman) 
    '((Initial (1)) 
    (Final (9)) 
    (From 1 to 1 by NP) 
    (From 1 to 2 by DET) 
    (From 1 to 3 by NP) 
    (From 2 to 3 by N) 
    (From 3 to 4 by BV) 
    (From 4 to 5 by ADV) 
    (From 4 to 5 by |#|) 
    (From 5 to 6 by DET) 
    (From 5 to 7 by DET) 
    (From 5 to 8 by |#|) 
    (From 6 to 7 by ADJ) 
    (From 6 to 6 by MOD) 
    (From 7 to 9 by N) 
    (From 8 to 8 by MOD) 
    (From 8 to 9 by ADJ) 
    (From 9 to 4 by CNJ) 
    (From 9 to 1 by CNJ) 
    (From 9 to 2 by CNJ) 
    (From 9 to 3 by CNJ) 
    (From 9 to 6 by CNJ))) 
> >(recognize-next 
    5 
    '(a happy woman) 
    '((Initial (1)) 
     (Final (9)) 
     (From 1 to 1 by NP) 
     (From 1 to 2 by DET) 
     (From 1 to 3 by NP) 
     (From 2 to 3 by N) 
     (From 3 to 4 by BV) 
     (From 4 to 5 by ADV) 
     (From 4 to 5 by |#|) 
     (From 5 to 6 by DET) 
     (From 5 to 7 by DET) 
     (From 5 to 8 by |#|) 
     (From 6 to 7 by ADJ) 
     (From 6 to 6 by MOD) 
     (From 7 to 9 by N) 
     (From 8 to 8 by MOD) 
     (From 8 to 9 by ADJ) 
     (From 9 to 4 by CNJ) 
     (From 9 to 1 by CNJ) 
     (From 9 to 2 by CNJ) 
     (From 9 to 3 by CNJ) 
     (From 9 to 6 by CNJ))) 
> > (recognize-next 
    6 
    '(happy woman) 
    '((Initial (1)) 
     (Final (9)) 
     (From 1 to 1 by NP) 
     (From 1 to 2 by DET) 
     (From 1 to 3 by NP) 
     (From 2 to 3 by N) 
     (From 3 to 4 by BV) 
     (From 4 to 5 by ADV) 
     (From 4 to 5 by |#|) 
     (From 5 to 6 by DET) 
     (From 5 to 7 by DET) 
     (From 5 to 8 by |#|) 
     (From 6 to 7 by ADJ) 
     (From 6 to 6 by MOD) 
     (From 7 to 9 by N) 
     (From 8 to 8 by MOD) 
     (From 8 to 9 by ADJ) 
     (From 9 to 4 by CNJ) 
     (From 9 to 1 by CNJ) 
     (From 9 to 2 by CNJ) 
     (From 9 to 3 by CNJ) 
     (From 9 to 6 by CNJ))) 
> > >(recognize-next 
     7 
     '(woman) 
     '((Initial (1)) 
     (Final (9)) 
     (From 1 to 1 by NP) 
     (From 1 to 2 by DET) 
     (From 1 to 3 by NP) 
     (From 2 to 3 by N) 
     (From 3 to 4 by BV) 
     (From 4 to 5 by ADV) 
     (From 4 to 5 by |#|) 
     (From 5 to 6 by DET) 
     (From 5 to 7 by DET) 
     (From 5 to 8 by |#|) 
     (From 6 to 7 by ADJ) 
     (From 6 to 6 by MOD) 
     (From 7 to 9 by N) 
     (From 8 to 8 by MOD) 
     (From 8 to 9 by ADJ) 
     (From 9 to 4 by CNJ) 
     (From 9 to 1 by CNJ) 
     (From 9 to 2 by CNJ) 
     (From 9 to 3 by CNJ) 
     (From 9 to 6 by CNJ))) 
> > > (recognize-next 
     9 
     '() 
     '((Initial (1)) 
     (Final (9)) 
     (From 1 to 1 by NP) 
     (From 1 to 2 by DET) 
     (From 1 to 3 by NP) 
     (From 2 to 3 by N) 
     (From 3 to 4 by BV) 
     (From 4 to 5 by ADV) 
     (From 4 to 5 by |#|) 
     (From 5 to 6 by DET) 
     (From 5 to 7 by DET) 
     (From 5 to 8 by |#|) 
     (From 6 to 7 by ADJ) 
     (From 6 to 6 by MOD) 
     (From 7 to 9 by N) 
     (From 8 to 8 by MOD) 
     (From 8 to 9 by ADJ) 
     (From 9 to 4 by CNJ) 
     (From 9 to 1 by CNJ) 
     (From 9 to 2 by CNJ) 
     (From 9 to 3 by CNJ) 
     (From 9 to 6 by CNJ))) 
#t 

をそれはネットワーク上にない、トレースは奇妙な動作をしています。たとえば、私が電話するとき:

(recognize english-1 '(not defined on the network)) 

出力は '(正しい)です。しかし、私はより詳細な情報を期待していました。

'() 

私はコマンドをどこに置くべきか疑問に思っていました。私は認識 - 次の定義の終わりの直前にそれを置く。これが適切な場所であるかどうかは不明です。

答えて

0

traceフォームは、トレース自体を挿入するようにバインディング自体を変更しますが、通常は直接使用するものではありません。代わりに、通常trace-definetrace-lambda、またはtrace-letを使用する方が簡単です。 (trace recognize-next)のあなたの直接の使用を外し、trace-defineを使用するものでrecognize-nextのあなたの定義を置き換えます

(trace-define (recognize-next node tape network) 
    ...) 

これは意図したとおりに、トレースを動作させる必要があります。

+0

ありがとう!それは正常に働いた。私が理解できないもう一つのことがあります。キムが私の略語の定義にあるので、なぜ呼び出す(英語-1 '(キム)を認識すると)空を返すのですか? –

+0

@fallowzito私は気づいていないと私は認めています。私はあなたのコードを実際には読んでいませんでした。ちょうど 'ラケット/トレース 'に関連する部分です。 ;)私はあなたがそれを理解することができると確信しています:私は彼らが間違っているのを把握するためにREPLであなたの機能を試してみるでしょう。また、 'debug'パッケージを見てみましょう。これは、プログラムのデバッグに役立ついくつかの便利なフォームを提供します。 –