Prolog程序的意外行为

我编写了一个Prolog程序,用于在无向图(或迷宫)中搜索路径。

pway(a, b,10).pway(b, e,10).pway(b, c,10).pway(d, e,10).pway(c, d,10).pway(e, f,10).pway(g, e,10).solve(X,X,T,N) :-    write(T), N is 0. % do nothingsolve(X,Y,T,N) :-    pway(X, Z,C),    not(member(Z, T)),    solve(Z, Y, [Z|T],M),    N is M+C. % There is a pway from X to Z, new list has z as head.solve(X,Y,T,N) :-    pway(Z, X,C),    not(member(Z, T)),    solve(Z, Y, [Z|T],M),N is M+C. % same, just takes care of non-directedness

我打算使用这个程序来进行如下查询:

?- solve(a,f,P,N). 

即,给出从a到f的路径P及其成本。

但这并未按预期工作。当我输入(P预期是一个列表)

?- solve(e,b,P,N).false. 

我得到false。(为什么?)

但是,当我输入:

?- solve(e,b,[],N).[b,e,f]N = 30 ;[b,c,d,e,f]N = 50 ;[b]N = 10 ;[b,e,d]N = 30 ;[b,c,d]N = 30 ;[b,e,g]N = 30 ;[b,c,d,e,g]N = 50 ;false.

我得到了结果。实际上,我从不希望在Prolog程序本身中使用write命令,我应该只通过输入第一个查询(返回false的那个)就能得到相同的结果。我无法找出错误所在。

任何帮助都将不胜感激。谢谢。


回答:

这是因为第三个参数并不是你所期望的#1和#2两个节点之间的路径。如果你在第三个参数中传递一个变量,那么目标not(member(Z, T))总是会失败,因此solve/3也会失败。

从你所说的话来看,你可能想要做的是这样的东西。

solve(X,Y,T,N) :- solve(X,Y,[],N,T).solve(X,X,T,0,T).solve(X,Y,T,N,O) :-    pway(X, Z,C),    \+ member(Z, T),    solve(Z, Y, [Z|T],M,O),    N is M+C.solve(X,Y,T,N,O) :-    pway(Z, X,C),    \+ member(Z, T),    solve(Z, Y, [Z|T],M,O),N is M+C.

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注