如何在prolog中实现更统一的回溯?

如何在prolog中实现更统一的回溯?,prolog,Prolog,假设我有: makeTillDone(X) :- try(X). makeTillDone(X1) :- changeOne(X1, X2), makeTillDone(X2). makeTillDOne(X1) :- changeTwo(X1, X2), makeTillDone(X2). prolog将尝试按顺序满足makeTillDone(X): try(X), ChangeOne(X1, X2), makeTillDone(X2) -> try(X) ChangeOne(X1,

假设我有:

makeTillDone(X) :- try(X).
makeTillDone(X1) :- changeOne(X1, X2), makeTillDone(X2).
makeTillDOne(X1) :- changeTwo(X1, X2), makeTillDone(X2).
prolog将尝试按顺序满足makeTillDone(X):

try(X), 
ChangeOne(X1, X2), makeTillDone(X2) -> try(X)
ChangeOne(X1, X2), makeTillDone(X2) -> changeOne(X3, X4), makeTillDone(X4) -> try(X) 
etc
如何实现更统一的回溯:

try(X), 
ChangeOne(X1, X2), makeTillDone(X2) -> try(X)
ChangeTwo(X1, X2), makeTillDone(X2) -> try(X)
ChangeOne(X1, X2), makeTillDone(X2) -> changeOne(X3, X4), makeTillDone(X4) -> try(X) 
changeOne(X1, X2), makeTillDone(X2) -> changeTwo(X3, X4), makeTillDone(X4) -> try(X) 
etc

不清楚你在问什么

您的程序是以下搜索树(或证明树)的表示形式

…将以最左边的第一个、最深的第一个方式遍历,直到根节点的a被证明为真(建设性地,因此我们得到了
X
的有效值)

这当然是递归完成的,本质上是将基本搜索树复制到较低的节点中(使用适当的变量重命名,此处不做):

您想要的搜索顺序似乎有点紧张:

可能广度优先搜索或更好的搜索是你想要的


然而,这并不像可能的那样简单,因为您不能仅仅更改Prolog的搜索策略,而是需要编写一个小的解释器:

不清楚您在问什么

您的程序是以下搜索树(或证明树)的表示形式

…将以最左边的第一个、最深的第一个方式遍历,直到根节点的a被证明为真(建设性地,因此我们得到了
X
的有效值)

这当然是递归完成的,本质上是将基本搜索树复制到较低的节点中(使用适当的变量重命名,此处不做):

您想要的搜索顺序似乎有点紧张:

可能广度优先搜索或更好的搜索是你想要的


然而,这并不像可能的那样简单,因为您不能仅仅更改Prolog的搜索策略,而是需要编写一个小的解释器:

您需要在contants的使用上保持一致:您的一些谓词(
ChangeOne(X1,X2)
)有一个以大写字母开头的函子(因此,函子看起来像一个变量而不是一个常量):这在基本Prolog中是不允许的。仍然有一些
ChangeOne/2
change2/2
…您需要在contant的使用上保持一致:您的一些谓词(
ChangeOne(X1,X2)
)有一个以大写字母开头的函子(因此,函子看起来像一个变量,而不是一个常量):这在基本Prolog中是不允许的。仍然有一些
ChangeOne/2
change2/2
。。。