不知道这个问题的措辞是否正确,我很抱歉。基本上我想做的是在 Prolog 中创建某种错误处理。例如:
fruit(apple, pear).
现在,如果用户要查询:
?- fruit(X).
我如何通知用户他们犯了错误?并返回一条消息:
Data should be entered in the format: 'fruit(X, Y)' Please check your query and
try again.
不知道这个问题的措辞是否正确,我很抱歉。基本上我想做的是在 Prolog 中创建某种错误处理。例如:
fruit(apple, pear).
现在,如果用户要查询:
?- fruit(X).
我如何通知用户他们犯了错误?并返回一条消息:
Data should be entered in the format: 'fruit(X, Y)' Please check your query and
try again.
在 ISO-Prolog 和符合标准的系统中,系统会发出诸如existence_error(procedure,fruit/1)
. 更准确地说,unknown
应该设置一个 Prolog 标志error
来获得该行为。大多数系统将此作为(非常合理的)默认值。但可以肯定的是,只需发出目标set_prolog_flag(unknown,error)
。
请注意,该错误表示fruit/1
预计会存在,但不会像您那样做任何进一步的假设。
您建议该错误是缺少的参数。这很可能是错误。同样,它可能是一个拼写错误fuit/1
,是法语(他逃跑)或拉丁语(他是)。或者,也许您只是忘记适当地嵌套该术语。谁知道。有很多很好的理论,实际错误可能是什么,所以你的建议应该更加谨慎。
在许多系统中都有类似的建议,它们通常连接到解释未捕获错误的顶级循环。
您可以像这样自己捕获此类错误:
?- catch(Goal, error(existence_error(procedure,Inex),_), Action_on_error).
我不认为这是应用程序程序员的工作。一些 Prolog 系统已经具有此功能。
对于这种特殊情况,您可以只创建一个输出消息的“错误”arity 谓词:
fruit(_) :-
write('Data should be entered in the format: \'fruit(X, Y)\' Please check your query and try again.'),
nl,
fail.