prolog cut 需要建议吗?
在这个任务中,我有一个 Prolog 数据库,其中包含例如 边缘(1,0) 边缘(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”来执行此操作。
有谁知道该怎么做或者可以给我一些指示吗?
in this task i have a Prolog database filled with e.g.
edge(1,0)
edge(2,0)
edge(1,3)
an edge signifies that two points are joined.
I am asked to write a function called reach(i,j,k) where i is the start point j is the end point and k is the number of steps you may use.
K is needed to stop the recursion looping e.g.
Suppose the only edge I’ve got goes from 1 to3,and I’m trying to get to 6. Then I can’t get from 1to6 in one go. so I’ll look for somewhere I can get to, and see if I can get from there to 6. The first place I can get to in one go is 3, so I’ll try to get from there to 6.
i have done this as so:
%% 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).
this works, however i am stuck with the second part in which we are asked not to use k but to use a "cut" to do this.
does anyone know how to do this or can give me some pointers?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这种削减确保一旦以一种方式解决目标,就不会寻找另一种方式。
例如:
no cut - 如果由于某种原因 Prolog 回溯,它将尝试以另一种方式从 I 到达 J。
您可能会觉得,如果简单的边缘有效,则没有必要以另一种方式到达此节点,在这种情况下,您可以这样做:
“切断”此目标的任何替代方案,但 Prolog 已经找到了一个。
The cut ensures that once a goal has been resolved in one way, it doesn't look for another way.
example:
no cut - if for some reason Prolog backtracks, it will try to reach from I to J another way.
You might feel there's no point reaching this node another way if the simple edge works, and in that case you can do:
which "cuts" any alternative to this goal, but the one Prolog has found.