2013-03-10 144 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