【问题标题】:Prolog - How do I catch an error of incorrect arity?Prolog - 我如何捕捉不正确的错误?
【发布时间】:2014-06-23 12:52:01
【问题描述】:

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

fruit(apple, pear).

现在如果用户要查询:

 ?- fruit(X).

我将如何通知用户他们犯了错误?并返回一条消息:

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

【问题讨论】:

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


    【解决方案1】:

    在 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).
    

    【讨论】:

      【解决方案2】:

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

      对于这种特殊情况,您可以创建一个带有“错误”数量的谓词来输出消息:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-10
        • 2010-12-06
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多