我正在努力做作业。需要在知识库中找到实体之间的连接,如下所示:
例如,找到o1
和o3
之间的关系。
rel(o1,p1,s2).
rel(o2,p2,s4).
rel(o3,p2,s1).
rel(o7,p5,s5).
rel(o9,p1,s4).
rel(o2,p6,s7).
rel(o3,p3,s2).
rel(o6,p6,s3).
rel(o5,p7,s2).
rel(o4,p2,s1).
rel(o3,p3,s1).
其中p
是一种关系。
到目前为止,我所做的是:
go(X,Y):-write(X),write(":1e: "),rel(X,Z,_),write(Z),write(":1r: "),
rel(Y,Z,_),write(Y),write(":1e: "),!.
go(X,Y):-write(X),write(":2e: "),rel(X,Z,V),write(Z),write(":2r: "),
write(V),write(":2v: "),rel(Y,W,V),write(W),write(":2r: "),
write(Y),write(":2e: "),!.
go(X,Y):-write(X),write(":3e: "),rel(X,Z,_),write(Z),write(":3r: "),
rel(W,Z,_),write(W),write(":3e: "),go(W,Y),!.
go(X,Y):-write(X),write(":4e: "),rel(X,_,V),write(V),write(":4v: "),
rel(W,_,V),write(W),write(":4e: "),go(W,Y).
但是当我尝试找到o1
和o3
go(o1, o3)
程序陷入第一次递归迭代。
答案 0 :(得分:3)
我没有看你的代码,因为有时碰巧陷入了一些盲点。
我只是制作了两个公式来定义这个问题,第一个是检查是否存在直接关系,这样这个查找器就可以结束了。
另一个人正在寻找第一个参数的关系,以及其他一些观点。这个程序有一个弱点(但我不知道它是否会影响你的例子) - 周期。如果你的关系中有周期,那么你必须使用列表来缓存你已经进入过的点。
relFinder(X1,X2) :-
(rel(X1,P,X2) ; rel(X2,P,X1)),
write(X1),write(" "),
write(P) ,write(" "),
write(X2).
relFinder(X1,X2) :-
(rel(X1,P,XT) ; rel(XT,P,X1)),
write(X1),write(" "),
write(P) ,write(" "),
relFinder(XT,X2).