如何在prolog中进行修剪以防止子节点生成它';请重新选择父节点

如何在prolog中进行修剪以防止子节点生成它';请重新选择父节点,prolog,Prolog,假设我有一个搜索树,我试图找到一个目标的所有解决方案。如果我不修剪树,这样子节点仍然可以生成它的父节点,搜索空间就会变得非常大。所以,有人能给我看一个做这件事的谓词,或者向我解释一下如何做,因为我对Prolog非常陌生。最简单的方法可能是在“搜索”谓词中添加一个额外的参数,该参数跟踪已访问的节点(父节点、子节点等),再加上一个禁止访问以前节点的子句 有些术语值得澄清。树是一个没有循环(循环)的图,因此在“搜索树”中,实际上没有可能再次访问节点两次 也许你正在寻找一条通向目标的路径,而解决方案就是

假设我有一个搜索树,我试图找到一个目标的所有解决方案。如果我不修剪树,这样子节点仍然可以生成它的父节点,搜索空间就会变得非常大。所以,有人能给我看一个做这件事的谓词,或者向我解释一下如何做,因为我对Prolog非常陌生。

最简单的方法可能是在“搜索”谓词中添加一个额外的参数,该参数跟踪已访问的节点(父节点、子节点等),再加上一个禁止访问以前节点的子句

有些术语值得澄清。树是一个没有循环(循环)的图,因此在“搜索树”中,实际上没有可能再次访问节点两次

也许你正在寻找一条通向目标的路径,而解决方案就是可能的路径。找到“目标的所有解决方案”的规定要求有些紧张,排除了多次重新访问节点的路径。但是,让我们假设不重新访问节点的限制是允许的


如果您提供了更多关于如何编写搜索谓词的信息,我将能够具体说明如何添加额外的“已访问列表”参数。

搜索
Prolog cut
即@chac:注意,问题要求“找到目标的所有解决方案”。同时,切割也不能阻止无限循环。@hardmath:是的,我明白了,但我不清楚OP是否已经知道了!为了能够删减搜索空间并仍能找到所有解决方案,您必须使用有关问题领域的一些附加知识,即使用启发式。为了防止循环(如果这是您的问题)“盲目”,您可以使用迭代深化。给我们更多的信息。