2011-06-02 78 views
2

請考慮以下Prolog代碼。它在其輸入中編輯特定類型的行,並打印出沒有任何改變的剩餘行。它使用一個名爲rule的DCG,它不包含在下面,因爲它對這個問題並不重要。在SWI-prolog中調試 - 未綁定變量

go:- 
    prompt(_, ''), 
    processInput. 

processInput:- 
    read_line_to_codes(current_input, Codes), 
    processInput(Codes). 

processInput(Codes):- 
    (Codes \= end_of_file 
    -> 
     (phrase(rule(Part1, Part2), Codes) 
     -> 
      format('~s - ~s\n', [ Part1, Part2 ]) 
     ; 
      format('~s\n', [ Codes ])), 
     processInput 
    ; 
     true). 

:- go, halt. 

這工作正常。但是,假設我將processInput/1更改爲以下內容,它只是說Warning: /home/asfernan/tmp/tmp.pl:28: Goal (directive) failed: user: (go,halt)

processInput(Codes):- 
    (Codes \= end_of_file 
    -> 
     (\+phrase(rule(Part1, Part2), Codes) 
     -> 
      format('~s\n', [ Codes ])) 
     ; 
      format('~s - ~s\n', [ Part1, Part2 ]), 
     processInput 
    ; 
     true). 

的,如果&的phrase(rule(Part1, Part2), Codes) DCG比賽的其他部分進行了交流。這顯然是一個新手的錯誤,但go, halt失敗的事實不是很有幫助。我能做些什麼來使錯誤信息表明失敗是因爲Part1 & Part2未綁定在format('~s - ~s\n', [ Part1, Part2 ])行?我能夠追蹤到這個錯誤,因爲代碼很小,但是如果代碼很大,我可能無法做到這一點。

回答

3

在Prolog以下是不一樣的:

..., (Cond -> Then ; Else), ... 

..., (\+ Cond -> Else ; Then), ... 

一般情況下,一個目標\+ Cond永遠不會實例化它的變量。所以你 必須堅持原來的配方。

如果您有興趣使用DCG處理整個 文件,請考慮SWI的library(pio)