gpt4 book ai didi

prolog - 如何在 Prolog 中捕获回溯(或定界延续)异常?

转载 作者:行者123 更新时间:2023-12-02 06:34:30 25 4
gpt4 key购买 nike

我是 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异常并获取X = 1。但结果是捕获了异常,没有任何继续。那么我应该怎样做才能达到我的目标呢?

在此处运行消息。

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

更新1:我尝试将 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]

更新2: got this from 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).

关于prolog - 如何在 Prolog 中捕获回溯(或定界延续)异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57316321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com