Prolog - 如何捕获不正确的arity错误?

时间:2014-06-23 12:52:02

标签: error-handling prolog try-catch iso-prolog prolog-toplevel

不确定问题措辞是否正确,我的道歉。基本上我想要做的是在Prolog中创建一些错误处理。例如:

fruit(apple, pear).

现在,如果用户要查询:

 ?- fruit(X).

我如何通知用户他们犯了错误?并返回以下行的消息:

Data should be entered in the format: 'fruit(X, Y)' Please check your query and 
try again.

2 个答案:

答案 0 :(得分:3)

在ISO-Prolog和符合要求的系统中,系统会发出existence_error(procedure,fruit/1)这样的错误信号。更准确地说,有一个Prolog标志unknown应设置为error以获得该行为。大多数系统将此视为(非常合理的)默认值。但可以肯定的是,只需发布​​目标set_prolog_flag(unknown,error)

请注意,错误表示fruit/1预计会存在,但不会像您那样做任何进一步的假设。

您建议错误是缺少参数。这可能是错误。同样,它可能是一个错字,意思是fuit/1,法语(他逃离)或拉丁语(他是)。或者你可能只是忘了适当地嵌套这个词。谁知道。有许多好的理论可能是实际的错误,所以你的建议应该更加谨慎。

在许多系统中都有类似的建议,它们通常连接到解释未捕获错误的顶层循环。

你可以自己捕捉到这样的错误:

?- catch(Goal, error(existence_error(procedure,Inex),_), Action_on_error).

答案 1 :(得分:0)

我不认为这是应用程序员的工作。一些Prolog系统已经具备此功能。

对于这种特殊情况,您可以使用"错误"创建一个谓词。输出消息的arity:

fruit(_) :-
    write('Data should be entered in the format: \'fruit(X, Y)\' Please check your query and try again.'), 
    nl, 
    fail.