首页 > 解决方案 > 如何在 Prolog 中捕获回溯(或定界继续)异常?

问题描述

我是 Prolog 的新手,并试图了解 catch/3 的一些示例。

我要运行的代码在这里。(使用 swi-prolog v8.0.3)

mylib.pl

mylib([1,2]).
mylib(1).
test(X):- mylib(X), length([1],X).

然后在 swipl 中查阅它,然后运行以下命令。

catch(test(X),error(Err,_Context),format('catch')).

所以在这里我想抓住typeError exception并得到X = 1。但结果是捕获了异常,没有任何事情继续发生。那么我应该怎么做才能达到我的目标呢?

在这里运行消息。

catch
Err = type_error(integer, [1, 2]),
_Context = context(length/2, _12488).

UPDATE1:我尝试将 mylib.pl 修改为以下内容:

mylib([1,2]).
mylib(1).
test(X):- mylib(X),catch(length([1],X),error(Err,_Context),format('catch')).

然后运行test(X).命令并得到以下结果。

?- test(X).
catch
X = [1, 2] ;
X = 1.

但我想要的是跳过X = [1, 2]

UPDATE2: 从reddit得到这个 我正在探索reset/3和shift/1的用法。如果有人可以举个例子,那就太好了。

标签: prolog

解决方案


使用 Prolog 的内置故障和回溯:

mylib([1,2]).
mylib(1). 
test(X):- 
    mylib(X),
    integer(X), % will fail on list, backtrack until a passing value for X is found, i.e. 1
    length([1],X).

推荐阅读