在这个任务中,我有一个 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”来做到这一点。
有谁知道如何做到这一点或可以给我一些指示?