2013-03-10 141 views
1

這是一個Prolog程序,我想檢查Linux軟件包之間的依賴關係以及是否存在任何衝突。在Prolog中測試軟件包衝突

dep(gnome1,gcc7). 
confl(gcc7,gcc8). 

% recursive chain dependency 
depend(X,Y):- dep(X,Y). 
depend(X,Y):- dep(X,Z), depend(Z,Y). 

% conflict(X,Y) holds if X and Y depend 
on two packages which conflict, conflict between two 
packages should be a symmetric relation. 

% my poor attempt 
conflict(X,Y):- depend(X,A), depend(Y,B), (confl(A,B) | confl(B,A)). 

回答

1

我認爲你的做法是差不多吧:

dep(gnome1,libc7). 
dep(gnome1,gcc7). 

dep(gnome2,gnome1). 
dep(gnome2,gcc8). 

confl(gcc7,gcc8). 

% recursive chain dependency 
depend(X,Y):- dep(X,Y). 
depend(X,Y):- dep(X,Z), depend(Z,Y). 

% conflict(X,Y) holds if X and Y depend 
% on two packages which conflict, conflict between two 
% packages should be a symmetric relation. 

conflict(X,Y) :- 
    depend(X,A), depend(Y,B), 
    X @< Y, % break symmetry 
    (confl(A,B) ; confl(B,A)). 

我平添了幾分(MIS)configuratoin的測試:

11 ?- conflict(X,Y). 
X = gnome1, 
Y = gnome2 ; 
false. 
+0

嗯...我得到這個輸出? - 衝突(swiprolog330,Y)。 Y = xmoose79; Y = xmoose79; Y = xmoose79; 錯誤。 – Ciphor 2013-03-10 22:02:03

+0

我應該得到7個不同的結果:/ – Ciphor 2013-03-10 22:02:31

+0

請發佈您的數據以獲得一些額外的幫助 – CapelliC 2013-03-10 23:02:46