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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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