作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试自学 Prolog。下面,我写了一些我认为应该返回无向图中节点之间的所有路径的代码......但它没有。我试图理解为什么这个特定的代码不起作用(我认为这将这个问题与类似的 Prolog 寻路帖子区分开来)。我在 SWI-Prolog 中运行它。有什么线索吗?
% Define a directed graph (nodes may or may not be "room"s; edges are encoded by "leads_to" predicates).
room(kitchen).
room(living_room).
room(den).
room(stairs).
room(hall).
room(bathroom).
room(bedroom1).
room(bedroom2).
room(bedroom3).
room(studio).
leads_to(kitchen, living_room).
leads_to(living_room, stairs).
leads_to(living_room, den).
leads_to(stairs, hall).
leads_to(hall, bedroom1).
leads_to(hall, bedroom2).
leads_to(hall, bedroom3).
leads_to(hall, studio).
leads_to(living_room, outside). % Note "outside" is the only node that is not a "room"
leads_to(kitchen, outside).
% Define the indirection of the graph. This is what we'll work with.
neighbor(A,B) :- leads_to(A, B).
neighbor(A,B) :- leads_to(B, A).
path(A, D, [B, C])
% Base Rule (R0)
path(X,Y,[]) :- neighbor(X,Y).
% Inductive Rule (R1)
path(X,Y,[Z|P]) :- not(X == Y), neighbor(X,Z), not(member(Z, P)), path(Z,Y,P).
?- path(bedroom1, stairs, P).
X = bedroom1
Y = stairs
Z = hall
P = []
?- neighbor(bedroom1, hall).
true.
?- not(member(hall, [])).
true.
?- path(hall, stairs, []).
true .
?- path(A, B, P).
最佳答案
欢迎来到序言!本质上,问题在于当您到达 not(member(Z, P))
时在 R1,P
仍然是一个纯变量,因为评估还没有到 path(Z, Y, P)
定义它。关于 Prolog 的令人惊讶但鼓舞人心的事情之一是 member(Ground, Var)
将生成包含 Ground
的列表并用 Var
统一它们:
?- member(a, X).
X = [a|_G890] ;
X = [_G889, a|_G893] ;
X = [_G889, _G892, a|_G896] .
not(member(Z, P))
的原因。将始终失败,导致 R1 始终失败。您获得所有 R0 解决方案而没有任何 R1 解决方案这一事实表明 R1 中的某些内容导致它始终失败。毕竟,我们知道 R0 有效。
path(X,Y,[Z|P]) :- not(X == Y), neighbor(X,Z), path(Z,Y,P), not(member(Z, P)).
?- path(bedroom1, stairs, P).
P = [hall]
path(Z,Y,P)
尽快生成带循环的解决方案。 , 只是在事后用
not(member(Z, P))
丢弃它们. (顺便说一句,为了稍微提高效率,我们可以切换到
memberchk/2
而不是
member/2
。当然,更快地做错误的事情并没有多大帮助。:)
关于Prolog中的寻路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15468082/
我正在尝试提供即时转码的视频。不幸的是,这意味着寻求不起作用。我假设这是因为浏览器不知道视频有多长,因此无法正确显示搜索栏。 有谁知道是否可以对视频的时长进行硬编码? 我想到的另一个选择可能是创建我自
我是一名优秀的程序员,十分优秀!