2017-06-16 24 views
2

我正在努力完成作業。需要像這樣在知識庫中找到實體之間的連接:在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) 

程序之間的連接會卡在第一次循環迭代。

+2

這個問題可能有所幫助:https://stackoverflow.com/questions/44557272/stop -condition換遞歸功能於序言 – coder

回答

3

我沒有看你的代碼,因爲有時恰好陷入了一些盲點。

我剛剛做了2個公式來定義這個問題,第一個是檢查是否存在直接關係,以便這個發現者可以結束。

另一個是尋找關係的第一個參數,和其他點。這個程序有一個弱點(但我看不出它是否影響你的例子) - 週期。如果你的關係週期比你必須使用列表來緩存你已經在的點。

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