2010-03-07 40 views
2

考慮:Prolog的錯誤捕獲

fruitid('Apple', 'Granny Smith', 1). 
fruitid('Pear', 'Bartlett', 2). 

如果我有條款

type_of_fruit(ID):- 
     fruitid(Fruit, _, ID), write(Fruit). 

我怎麼能實現捕捉錯誤輸入的方法?

例如

fruitid(5). 

感謝。

AS

回答

4

集Prolog的標誌和使用捕捉/ 3

假設SWI Prolog的

1)prolog_flags可以改變錯誤的行爲。 首先允許系統捕獲錯誤並報告。 unknown標誌用於未知謂詞,如fruitID/1

set_prolog_flag(report_error,true). 
set_prolog_flag(unknown,error). 

現在使用了錯誤的謂詞元數時,應該有這樣的錯誤消息:

?- fruitid(5). 
ERROR: toplevel: Undefined procedure: fruitid/1 (DWIM could not correct goal) 

2)陷阱例外,如本中的代碼, 裹在一個catch目標/ 3謂詞。 來自1)的settigs是stil必需的。 這是在代碼中捕獲未定義謂詞的方法, 或捕獲有關此事的任何異常。 用所需的處理程序替換格式/ 3:

while_running_some_program:- 
    catch(foodid(5), 
     error(Err,_Context), 
     format('You done goofed! ~w\n', [Err])), 
    rest_of_code.