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

标签 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)

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

最佳答案

我没有看你的代码,因为有时会陷入某些盲点。

我刚刚做了两个公式来定义这个问题,第一个是检查是否存在直接关系,这样这个查找器就可以结束。

另一个正在寻找第一个参数和其他一些点的关系。这个程序有一个弱点(但我看不出它是否会影响你的例子) - 循环。如果您的关系中有循环,那么您必须使用列表来缓存您已经进入的点。

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

关于prolog - 在 Prolog 中查找实体之间的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44578901/

相关文章:

prolog - Prolog 中的锁挑战

list - 解释为什么 append/3 在这些情况下会产生无限数量的解决方案

list - 有没有办法只对 Prolog 中包含字母和整数的对列表中的整数求和?

list - Prolog - 返回矩阵的第 n 行

prolog - 我可以用谓词中的变量来代替仿函数吗

prolog - 创建 Prolog 词汇表

java - Java的嵌入式Prolog解释器/编译器

prolog - 在递归/回溯中累积

prolog - 如何卡住变量列表的目标?

prolog - 使用运算符连字符的嵌套对