在这个任务中我有一个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但是使用“剪切”来做到这一点。
有谁知道怎么做或者能给我一些指示?
答案 0 :(得分:0)
切割确保一旦目标以一种方式解决,它就不会寻找另一种方式。
示例:
reach(I, J,_K) :-
edge(I, J).
没有削减 - 如果由于某种原因Prolog回溯,它会尝试从另一个方向从I到J。 如果简单边缘有效,您可能会觉得以另一种方式到达此节点是没有意义的,在这种情况下您可以这样做:
reach(I, J,_K) :-
edge(I, J),
!.
“切断”了这个目标的任何替代方案,但Prolog找到了。