如何在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
。。。