Prolog,点之间的部分数量

时间:2015-10-12 18:46:44

标签: prolog

我在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).

1 个答案:

答案 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。:关于那些警告 - 例如,以上都不允许从节点到自身的零长度路径。根据您的需要,可能是这种情况或错误。