Recursion prolog cut需要建议吗?

Recursion prolog cut需要建议吗?,recursion,prolog,prolog-cut,Recursion,Prolog,Prolog Cut,在这个任务中,我有一个Prolog数据库,其中包含。 边缘1,0 边缘2,0 边缘1,3 边表示两个点连接在一起 我被要求编写一个名为reachi,j,k的函数,其中I是起点,j是终点,k是可以使用的步数。 需要K来停止递归循环,例如 假设我唯一的优势是从1到3,我正试图达到6。那我就不能一次从1到6。所以我要找个我能去的地方,看看能不能从那里到6点。我能一次性到达的第一个地方是3号,所以我会尽量从那里到达6号 我这样做是为了: %% Can you get there in one s

在这个任务中,我有一个Prolog数据库,其中包含。 边缘1,0 边缘2,0 边缘1,3

边表示两个点连接在一起

我被要求编写一个名为reachi,j,k的函数,其中I是起点,j是终点,k是可以使用的步数。 需要K来停止递归循环,例如

假设我唯一的优势是从1到3,我正试图达到6。那我就不能一次从1到6。所以我要找个我能去的地方,看看能不能从那里到6点。我能一次性到达的第一个地方是3号,所以我会尽量从那里到达6号

我这样做是为了:

    %% Can you get there in one step (need two rules because all links are
%% from smaller to greater, but we may need to get from greater to smaller.

reach1(I, J,_K) :-
    edge(I, J).
reach1(I, J,_K) :-
    edge(J, I).
%% Chhose somewhere you can get to in one step: can you get from there
%% to your target?
reach1(I,J,K) :-
    K>1,
    edge(I, B),
    K1 is K-1,
    reach1(B,J,K1).

reach1(I,J,K) :-
    K>1,
    edge(B, I),
    K1 is K-1, 
    reach1(B,J,K1).
这是可行的,但是我被第二部分困住了,在第二部分中,我们被要求不要使用k,而是使用一个cut来实现这一点


有人知道怎么做吗,或者能给我一些建议吗?

这个切入点确保了一旦目标以一种方式解决了,它就不会寻找另一种方式

例如:

reach(I, J,_K) :-
    edge(I, J).
无切割-如果出于某种原因,Prolog返回轨道,它将尝试以另一种方式从I到达J。 如果simple edge起作用,您可能会觉得以另一种方式到达此节点没有意义,在这种情况下,您可以执行以下操作:

reach(I, J,_K) :-
    edge(I, J),
    !.

这就切断了这个目标之外的任何选择,但是Prolog已经找到了一个。

您可能想看看在哪里讨论了图的遍历。那里的解决方案也不使用切割,但我相信它要优雅得多。当然,您可以重写该解决方案,以便在到达已访问的节点时使用剪切来修剪回溯树。我不明白这样做意味着什么,但不使用K,因为它是reach1/3规范的一部分。另外,您的前两个规则,即单步情况,应该假定reach1的第三个参数不是K而是1。查找路径的一个普遍问题是如何避免无休止的递归,例如从1到2、返回到1、返回到2等等,而不向实际目标前进。也许最初的演习旨在探索防止这种循环的各种方法。从目前的要求很难判断。