Prolog 错误捕获

ano*_*tat 3 prolog

鉴于:

fruitid('Apple', 'Granny Smith', 1).
fruitid('Pear', 'Bartlett', 2).
Run Code Online (Sandbox Code Playgroud)

如果我有条款

type_of_fruit(ID):-
       fruitid(Fruit, _, ID), write(Fruit).
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现一种方法来捕捉错误的输入?

例如

fruitid(5).
Run Code Online (Sandbox Code Playgroud)

谢谢。

作为

fra*_*ser 5

设置 Prolog 标志并使用 Catch/3

假设 SWI Prolog

1) prolog_flags 可以改变错误行为。首先让系统捕获错误并报告。该unknown标志用于未知谓词,例如fruitID/1.

set_prolog_flag(report_error,true).
set_prolog_flag(unknown,error). 
Run Code Online (Sandbox Code Playgroud)

现在,当使用了错误的谓词 arity 时,应该会出现这样的错误消息:

?- fruitid(5).
ERROR: toplevel: Undefined procedure: fruitid/1 (DWIM could not correct goal)
Run Code Online (Sandbox Code Playgroud)

2) 要在代码中捕获诸如此类的异常,请将目标包装在 catch/3 谓词中。仍然需要 1) 中的 settigs。这是在代码中捕获未定义谓词或捕获任何异常的方法。将 format/3 替换为所需的处理程序:

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