Search 需要递归循环退出语句
这是一个简单的递归prolog示例。我不知道在哪里,以及或多或少如何声明退出声明。试飞(sofia,dublin)应该返回true,但它会在最后一步继续检查您是否可以directFlight(dublin,dublin)。代码如下:Search 需要递归循环退出语句,search,prolog,Search,Prolog,这是一个简单的递归prolog示例。我不知道在哪里,以及或多或少如何声明退出声明。试飞(sofia,dublin)应该返回true,但它会在最后一步继续检查您是否可以directFlight(dublin,dublin)。代码如下: directFlight(sofia, varna). directFlight(sofia, paris). directFlight(sofia, london). directFlight(london, edinburg). directFlight(par
directFlight(sofia, varna).
directFlight(sofia, paris).
directFlight(sofia, london).
directFlight(london, edinburg).
directFlight(paris, new_york).
directFlight(new_york, seattle).
directFlight(london, dublin).
flight(City1, City2) :-
directFlight(City1, City3),
flight(City3, City2).
输出:
[trace] ?- flight(sofia, dublin).
Call: (8) flight(sofia, dublin) ? creep
Call: (9) directFlight(sofia, _878) ? creep
Exit: (9) directFlight(sofia, varna) ? creep
Call: (9) flight(varna, dublin) ? creep
Call: (10) directFlight(varna, _878) ? creep
Fail: (10) directFlight(varna, _878) ? creep
Fail: (9) flight(varna, dublin) ? creep
Redo: (9) directFlight(sofia, _878) ? creep
Exit: (9) directFlight(sofia, paris) ? creep
Call: (9) flight(paris, dublin) ? creep
Call: (10) directFlight(paris, _878) ? creep
Exit: (10) directFlight(paris, new_york) ? creep
Call: (10) flight(new_york, dublin) ? creep
Call: (11) directFlight(new_york, _878) ? creep
Exit: (11) directFlight(new_york, seattle) ? creep
Call: (11) flight(seattle, dublin) ? creep
Call: (12) directFlight(seattle, _878) ? creep
Fail: (12) directFlight(seattle, _878) ? creep
Fail: (11) flight(seattle, dublin) ? creep
Fail: (10) flight(new_york, dublin) ? creep
Fail: (9) flight(paris, dublin) ? creep
Redo: (9) directFlight(sofia, _878) ? creep
Exit: (9) directFlight(sofia, london) ? creep
Call: (9) flight(london, dublin) ? creep
Call: (10) directFlight(london, _878) ? creep
Exit: (10) directFlight(london, edinburg) ? creep
Call: (10) flight(edinburg, dublin) ? creep
Call: (11) directFlight(edinburg, _878) ? creep
Fail: (11) directFlight(edinburg, _878) ? creep
Fail: (10) flight(edinburg, dublin) ? creep
Redo: (10) directFlight(london, _878) ? creep
Exit: (10) directFlight(london, dublin) ? creep
Call: (10) flight(dublin, dublin) ? creep
Call: (11) directFlight(dublin, _878) ? creep
Fail: (11) directFlight(dublin, _878) ? creep
Fail: (10) flight(dublin, dublin) ? creep
Fail: (9) flight(london, dublin) ? creep
Fail: (8) flight(sofia, dublin) ? creep
false.
问题出现在:失败:(10)航班(都柏林,都柏林)?爬行
有没有办法解决这个问题?不要考虑需要退出语句的循环。事实上,根本不要使用调试器,即使您确实知道Prolog处理器中发生了什么,调试器也会让人非常困惑 从一组边(关系)连接的节点网络开始 在这种情况下,节点由原子(表示城市)表示,这组边的关系称为
directFlight/2
现在,您需要覆盖另一组边,称为flight/2
所以你必须问问自己,我什么时候在两个原子之间有一个flight/2
边缘a
和B
有两种情况:
directFlight/2
(基本情况)I
,则在I
和B
之间存在flight/2
从a
到I
和directFlight/2
I
,使得a
和I
之间存在directFlight/2
,并且flight/2
从I
到B
航班/2
边缘
flight(sofia, dublin).
(与关系数据库查找SQL查询结果相同)但必须注意终止。上述备选案例(3)将导致成功搜索或“错误”。案例(2)将导致不终止——完全是由于Prolog的搜索策略(其中必须决定真实世界的机器如何通过网络进行搜索,在这种情况下,深度优先,最左边优先)
这是flight/2
(第一幅图像)的基本情况,所有flight/2
都是通过递归1次调用深度推导出来的,所有flight/2
都是通过递归2次调用深度推导出来的
因此:
然后:
?- flight(sofia,dublin).
true ;
false.
?- flight(sofia,X).
X = varna ;
X = paris ;
X = london ;
X = new_york ;
X = seattle ;
X = edinburg ;
X = dublin ;
false.
?- flight(X,sofia).
false.
增编1
可以读取上述程序:
- “从左:-到右”(就像Prolog一样)。这是一种搜索,以确定
事实是否成立,或者是否可以找到使其成立的值航班/2
- “从右-:到左”。人们脑海中的形象是不断积累有关飞行/2的新事实,直到人们收集完所有事实,再也没有添加任何东西:自下而上的搜索(至少对我来说,这对大脑来说比较容易)。比搜索更安全,因为您不会因为子句以一种不幸的方式排列而冒着遇到无限递归陷穴的风险,这也是一些数据日志实现所做的
flight/2
应该如何构造的约束条件:
∀(City1, City2) :
(flight(City1, City2) <=
directFlight(City1, City2))
∧
∀(City1, City2) :
(flight(City1, City2) <=
(∃City3: directFlight(City1, City3) ∧ flight(City3, City2))
没有一个城市的距离超过3跳,因此上述程序将找到所有flight/2
连接
实际上,另一个练习是生成上面的程序,把它作为“最大深度”的参数来考虑。 你需要一个如何将这个基本情况添加到我的代码中的建议吗?Prolog没有语句,因此你不能“声明退出语句”。许多新程序员没有做到的一件事是,从用笔和纸来解决问题开始。一旦你理解了纸和笔的问题,并且可以用不同的问题重现结果,然后将其翻译成程序。记住,计算机是帮助你完成任务的工具,就像螺丝刀可以帮助你正确地使用螺丝,正确地理解问题也是如此。换句话说,你不会用锤子来装螺丝。
closure(directFlight,a,B)
using.@GuyCoder一点也不会(或者说,我绝对不会)。仅将directFlight/2
的传递闭包编码为两子句谓词。Stackoverflow现在警告我,我的最新编辑只能在“更彻底且当前编辑”的情况下保存。他们在编辑中使用了TensorFlow魔法决策引擎吗?“这个地方正在向下游发展。”“还没有!”@GuyCoder我的意思是,下一个问题是关于路线的建设。感谢您的图形欣赏。
∀(City1, City2) :
(flight(City1, City2) <=
directFlight(City1, City2))
∧
∀(City1, City2) :
(flight(City1, City2) <=
(∃City3: directFlight(City1, City3) ∧ flight(City3, City2))
directFlight(sofia, varna).
directFlight(sofia, paris).
directFlight(sofia, london).
directFlight(london, edinburg).
directFlight(paris, new_york).
directFlight(new_york, seattle).
directFlight(london, dublin).
flight(City1, City2) :- directFlight(City1, City2).
flight(City1, City2) :- directFlight(City1, Ia),
directFlight(Ia, City2).
flight(City1, City2) :- directFlight(City1, Ia),
directFlight(Ia, Ib),
directFlight(Ib, City2).
flight(City1, City2) :- directFlight(City1, Ia),
directFlight(Ia, Ib),
directFlight(Ib, Ic),
directFlight(Ic, City2).