prolog - 如何在 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 的内置故障和回溯:
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).
推荐阅读
- c++ - 对 const 引用的右值分配和非 const 引用右值分配问题背后的原因
- c# - 如何在被调用的类中正确初始化二维数组
- python - Removing extra characters when reading csv
- java - 快速移动鼠标时相机有时会倒置
- angular - Wait for multiple http requests to finish before running a function in angular
- mysql - 与多个 AND 谓词混淆
- spring - Updating array afte doing a post request
- facebook - Facebook 目录像素产品数据源 - 删除已删除的产品
- r - code to query the table and produce a country code grouped and plot bar plot
- google-app-engine - How to fix the "Invalid JSON payload received. Unknown name" error