2016-03-31 34 views
2

Grafikteki tüm yolları bulmak için aşağıdaki kurallara sahibim.Veri bloğunda döngü kenarları ekleme (bddbddb)

path(X,Y) :- edge(X,Y). 
path(X,Y) :- edge(X,Z), path(Z,Y). 

Ancak,> n zaten mevcut değilse n kenar eklemek kadar, aynı zamanda, her bir düğüm N, için istiyoruz.

Düğümlerle herhangi bir ilişkisi olmadan bunu nasıl yapabilirim?

cevap

3

yalnız Prolog'da şu yazılır:

 
path(X,X). 
path(X,Y) :- false, edge(X,Y). 
path(X,Y) :- edge(X,Z), path(Z,Y). 

veya biraz daha kısa ve daha sonlanan closure0/3 kullanarak. onlar çözümlerin sonsuz dizi itiraf beri

 
path(X,Y) :- 
    closure0(edge, X,Y). 

yılında (birçok tanımları) Prolog bir alt kümesi olarak Datalog, path(X,X). gibi gerçekler, izin verilmez. Bu nedenle, bu gerçeği sonlu düğümler kümesiyle kısıtlamanız gerekir. on line

path(X,X) :- 
    node(X). 
path(X,Y) :- 
    edge(X,Z), 
    path(Z,Y). 
+0

Hata: Şimdi yol açar

node(X) :- edge(X,_). node(Y) :_ edge(_,Y). 

: Eğer düğüm açık bir tanımını olmadığı için ancak, sahip kenarlarında dayanan bir tane yapmak gerekir ' yol (X, X): - düğüm (X). ' ^ Tek bir terimde birden çok kez tekrarlanan değişkenler – eternalStudent

+1

emma: Yani gerçekten başka bir sistem kullanıyorsunuz ve bu tamamen Prolog ile alakasız. Sorunuzdaki bu sistemin adını belirtmelisiniz. – false

+0

Bu bddbddb sisteminin datalog dili. Bu kadar farklı mı? – eternalStudent