如何将有限失败的分支添加到Prolog可视化工具?

如何将有限失败的分支添加到Prolog可视化工具?,prolog,visualizer,prolog-toplevel,Prolog,Visualizer,Prolog Toplevel,假设我们想要可视化这个Prolog执行。没有来自菲茨基群岛的进球,或者其他一些异国情调的假设,只有好的老球 使用默认选择规则: p(a). p(b). ?- \+ p(c). Yes 但是我们只有一个Prolog可视化工具可以显示派生 没有否定作为失败,就像。我们怎样才能提高效率 Prolog visualizer还可以将否定显示为失败?否定的好处是,为否定作为失败编写元解释器要比为cut(!)编写元解释器容易得多。因此,基本上,SLDNF的普通解释器可以通过插入一条附加规则从SLD的普通解

假设我们想要可视化这个Prolog执行。没有来自菲茨基群岛的进球,或者其他一些异国情调的假设,只有好的老球 使用默认选择规则:

p(a).
p(b).

?- \+ p(c).
Yes
但是我们只有一个Prolog可视化工具可以显示派生 没有否定作为失败,就像。我们怎样才能提高效率
Prolog visualizer还可以将否定显示为失败?

否定的好处是,为否定作为失败编写元解释器要比为cut(!)编写元解释器容易得多。因此,基本上,SLDNF的普通解释器可以通过插入一条附加规则从SLD的普通解释器派生而来:

solve(true) :- !.
solve((A,B)) :- !, solve(A), solve(B).
solve((\+ A)) :- !, \+ solve(A). /* new */
solve(H) :- functor(H, F, A), sys_rule(F/A, H, B), solve(B).
现在,我们可以继续并扩展solve/3了。但我们做了更多的事情,我们也在搜索树中写出失败分支,就像Prolog visualizer通过删除子句所做的那样。因此,修正后的solve/3如下:

% solve(+Goal, +Assoc, +Integer, -Assoc)
solve(true, L, _, L) :- !.
solve((A, B), L, P, R) :- !, solve(A, L, P, H), solve(B, H, P, R).
solve((\+ A), L, P, L) :- !, \+ solve(A, L, P, _). /* new */
solve(H, L, P, R) :- functor(H, F, A), sys_rule(F/A, J, B),
   callable_property(J, sys_variable_names(N)),
   number_codes(P, U), atom_codes(V, [0'_|U]), shift(N, V, W),
   append(L, W, M), 
   (H = J -> true; offset(P), write(fail), nl, fail),  /* new */
   reverse(M, Z), triage(M, Z, I, K),
   offset(P), write_term(I, [variable_names(Z)]), nl,
   O is P+1, solve(B, K, O, R).
下面是一个运行示例:

?- ?- \+ p(c).
fail
fail
Yes
另见:

人工智能算法、数据结构和习惯用法
CH6:三个元口译员
格奥尔格·卢格-艾迪生·韦斯利2009

这是一个好问题,但您怀疑StackOverflow是否能解决这个问题。(还有,关于冻结目标,当目标、一般属性变量目标、约束目标、dif目标、设置\调用\清理目标和捕获目标?)继续,问这样的问题,展示你所做的。根据occams razor,这些问题超出了我的问题范围,只是关于默认的SLDNF,没有延迟的目标。