2013-07-16 44 views
2

我希望prolog引擎返回false而不是错误。 我有这样的代码:忽略序言中的类型错误并返回false而不是

:-use_module(library(clpfd)). 

set_1(X):-member(X,[f(f(1))]). 
p :- X in 1..3,set_1(f(X)). 

当我查询P,我得到一个错误:

?- p. 
ERROR: Type error: `integer' expected, found `f(1)' 

我希望输出的样子:

?- p. 
false 

我希望看到即使将成员(X,[f(f(1))])更改为成员(X,[f(f(f(1)))]]或某个其他集合,也不会做任何其他更改我的程序。

我使用SWI-Prolog的v 5.9.4

回答

3

使用catch/3。例如:

?- catch(p, error(type_error(_,_),_), false). 
false. 

这是完美声明由OK这样无声的故障更换错误。对于实例化错误,这是不正确的,因为当您添加更多目标时,实例化错误可能转向解决方案,但类型错误不能。

+0

谢谢,这有助于。不幸的是,在某些情况下,错误情况下返回false的行为不是预期的行为。考虑set_1(X): - member(X,[f(f(1)),f(1)])。答案应该是真的,但它会返回false,因为在与第一个参数匹配时出现错误。我最终实现了自己的成员函数,它始终有效。 –