prolog削减所需的建议?

时间:2011-03-02 13:03:10

标签: recursion prolog prolog-cut

在这个任务中我有一个Prolog数据库填充例如 缘(1,0) 缘(2,0) 缘(1,3)

边缘表示两个点已连接。

我被要求写一个名为reach(i,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但是使用“剪切”来做到这一点。

有谁知道怎么做或者能给我一些指示?

1 个答案:

答案 0 :(得分:0)

切割确保一旦目标以一种方式解决,它就不会寻找另一种方式。

示例:

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

没有削减 - 如果由于某种原因Prolog回溯,它会尝试从另一个方向从I到J。 如果简单边缘有效,您可能会觉得以另一种方式到达此节点是没有意义的,在这种情况下您可以这样做:

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

“切断”了这个目标的任何替代方案,但Prolog找到了。