在Prolog中查找实体之间的连接

时间:2017-06-16 00:16:50

标签: prolog

我正在努力做作业。需要在知识库中找到实体之间的连接,如下所示:

例如,

找到o1o3之间的关系。

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

但是当我尝试找到o1o3

之间的关联时
go(o1, o3)

程序陷入第一次递归迭代。

1 个答案:

答案 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).