1

在这个任务中,我有一个 Prolog 数据库,其中填充了例如 edge(1,0) edge(2,0) edge(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 而是使用“cut”来做到这一点。

有谁知道如何做到这一点或可以给我一些指示?

4

1 回答 1

0

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

例子:

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

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

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

它“削减”了这个目标的任何替代方案,但 Prolog 已经找到了。

于 2011-04-29T22:51:14.770 回答