gpt4 book ai didi

prolog - Prolog 中的打印路径

转载 作者:行者123 更新时间:2023-12-01 23:13:22 24 4
gpt4 key购买 nike

我想打印有向图中节点的路径。此代码适用于边,但不适用于整个路径。当涉及路径时,它返回 false。这是我的代码,但它只运行一个边缘而不是整个路径。请帮助我。

这是我的代码:

path(Node1, Node2, X) :-
edge(Node1, Node2),
append([Node1], [Node2], X).
path(Node1, Node2, X, N) :-
edge(Node1, SomeNode),
append([Node1], [SomeNode], X),
path(SomeNode, Node2, X, N),
append([], [Node2], X).

X 是一个列表。

最佳答案

虽然@WouterBeek 已经指出了您的问题,但 Wouter 的声明

Without running this code you can already observe that the second clause will always fail, since a list of length 2 cannot be unified with a list of length 1

值得详细说明。对于有经验的 Prolog 程序员来说,很容易发现此类问题。但是初学者能做什么呢?他们可以应用以下技术:泛化你的程序,如果泛化后的程序仍然过于特化,那么其余部分肯定有错误。

推广一个纯 Prolog 程序

有几种方法可以概括一个纯 Prolog 程序:要么删除目标,要么删除 head 或目标参数中的子项。要删除目标,我将在目标前添加一个 *,使用:

:- op(950,fy, *).*_.path(Node1, Node2, X) :-  * edge(Node1, Node2),  append([Node1], [Node2], X).path(Node1, Node2, X) :-  * edge(Node1, SomeNode),  append([Node1], [SomeNode], X),  * path(SomeNode, Node2, X),  append([], [Node2], X).

Now we can ask the most general query of this new predicate:

?- path(N1, N2, P).
P = [N1,N2]
; false.

因此:虽然这个定义现在是一个(过度)泛化,它仍然只承认长度为2的路径。这个问题完全独立于edge/3的定义,只有剩下的部分负责。所以看看剩下的部分来解决问题!

关于prolog - Prolog 中的打印路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23174999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com