相关疑难解决方法(0)

BProlog 8.1中不均匀的制表性能

我用版本8.1 的表格功能做了一些实验, 并且对我观察到的性能感到非常惊讶.

这是我使用的代码.它计算将一些正整数减少到以下所需的Collat​​zN数:I1

%:- table posInt_CollatzSteps/2.               % remove comment to enable tabling
posInt_CollatzSteps(I,N) :-
   (  I == 1
   -> N = 0                                                % base case
   ;  1 is I /\ 1 
   -> I0 is I*3+1, posInt_CollatzSteps(I0,N0), N is N0+1   % odd
   ;  I0 is I>>1,  posInt_CollatzSteps(I0,N0), N is N0+1   % even
   ).
Run Code Online (Sandbox Code Playgroud)

要确定从所有整数需要减少最大步数I0I:

i0_i_maxSteps0_maxSteps(I0,I,M0,M) :-
   (  I0 > I
   -> M0 = M
   ;  posInt_CollatzSteps(I0,N0),
      I1 is …
Run Code Online (Sandbox Code Playgroud)

performance prolog memoization b-prolog prolog-tabling

5
推荐指数
0
解决办法
139
查看次数

处理复杂的序言循环

我正在使用 Prolog 在我的一个项目中编码一些相当复杂的规则。有很多递归,包括相互递归。部分规则如下所示:

pred1(X) :- ...
pred1(X) :- someguard(X), pred2(X).

pred2(X) :- ...
pred2(X) :- othercondition(X), pred1(X).
Run Code Online (Sandbox Code Playgroud)

pred1和之间有一个相当明显的无限循环pred2。不幸的是,这些谓词之间的交互非常复杂且难以隔离。我能够通过传递已传递给 的对象列表来消除此实例中的无限循环pred1,但这非常笨拙!事实上,它在很大程度上违背了在这个应用程序中使用 Prolog 的目的。

如何让 Prolog 避免无限循环?例如,如果在证明过程中pred1(foo)尝试将证明pred1(foo)作为子目标,则失败并回溯。

是否可以使用元解释器来做到这一点?

prolog prolog-metainterpreter

5
推荐指数
1
解决办法
106
查看次数