Prolog程序脱离全局堆栈错误

时间:2014-08-30 01:36:06

标签: error-handling prolog out-of-memory proof

我正在尝试一个定理证明程序。但规则4似乎执行得很糟糕。

% delete
del(X, [X | Tail], Tail).
del(X, [Y | Tail], [Y | Tail1]) :-
    del(X, Tail, Tail1).

% remove 
remove(X, Y, L1, L2) :-
    del(X, L1, L3),
    del(Y, L3, L2).

% prove
prove(true).
prove([L1 seq L2]) :-
    seq(L1, L2),
    !.

% Rule 1
seq(L1, L2) :-
    member(X, L1),
    member(X, L2),
    !.

% Rule 4
seq(L1, L2) :-
    Z = or(X, Y),
    del(Z, L2, L4),
    remove(X, Y, L3, L4),
    seq(L1, L3).

prove([[p] seq [q]]). - 生成错误,这是正确的 prove([[p] seq [q, r]]). - 生成错误,正确。
但是prove([[p] seq [q or r]]). - 超出全局堆栈。然后我认为规则4有问题。
知道如何解决这个问题吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

在规则4中,尽我所知,你

  • 将Z设置为或
  • 的模板
  • 尝试从L2中删除该模板,以便L4被遗忘,并填充该模板(X和Y)的组件,
  • 找到一个L3,从中可以删除或删除组件,也可以给L4,
  • 然后你尝试用L3而不是L2来解决问题

但这意味着L3不一定会在终止方面取得任何进展。