我在Prolog有一项任务。这似乎很容易,但我真的是这种语言的新手,我无法使用它。
我必须编写一个函数path_L(a,z,N)
,其中a,z
- 边缘" road",N是我正在寻找的变量。因此,有许多边定义单向:edge(a,b)
,edge(b,c)
,edge(b,d)
,edge(e,f)
等。path_L
函数的目标是以(a,z)
的形式提供N=result
之间的部分数量。所以,例如:
path_L(a,b,N). -> N=1
path_L(a,c,N). -> N=2
我已经定义了另一个函数来定义(X,Y)之间的路径是否存在:
path(X,Y):-edge(X,Y).
path(X,Y):-edge(X,Z),path(Z,Y).
答案 0 :(得分:2)
假设像@lurker所说的那样,你的意思是找到一条路径:
path(X,Y):- edge(X,Y).
path(X,Y):- edge(X,Z), path(Z,Y).
并给出了一些条款,说明边缘的存在:
edge(a,b).
edge(b,c).
edge(c,d).
你有一个正确的想法,path_L
应该有一个额外的参数,用于节点之间的边数'count'。您想要的简单版本(有一些警告)如下:
path_L(X,Y,1):- edge(X,Y).
path_L(X,Y,R):- edge(X,Z), path_L(Z,Y,N), R is N+1.
注意第一种情况如何简单地将第三个参数与'1'统一,因此像path_L(a,b,2)
这样的客观子句(“a和b之间的距离为2”)正确失败,而path_L(a,b,R)
(通知R是一个变量)成功与R统一为1.这个范例的一个简洁特征是相同的定义对“两种方式”都有好处。
另一个例子是目标path_L(a,B,2)
(通知B是一个变量),它与B与c
统一后成功 - 因为c
是距{{1}的距离的节点1}}。
最后,假设一个图表给出:
a
像edge(a,b).
edge(b,c).
edge(c,d).
edge(d,x).
edge(a,x).
这样的客观条款应该首先成功,R = 1,然后,如果请求(按终端上的path_L(a,x,R)
),R = 4。这是因为;
到a
有两个有效路径(长度为1和4)。谓词的顺序很重要 - 如果你这样定义x
:
path_L
同样的查询会在R = 4中产生 first ,然后在R = 1中产生。这是因为谓词定义的顺序。实际上,Prolog选择哪个谓词进行测试以及如何选择条款来“解决问题”的机制已经明确定义;如果你进入逻辑编程,你肯定应该look it up。
希望这有帮助。
P.S。:关于那些警告 - 例如,以上都不允许从节点到自身的零长度路径。根据您的需要,可能是这种情况或错误。