1

これは、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)).
4

1 に答える 1

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

テストするために少し(誤った)設定を追加しました:

11 ?- conflict(X,Y).
X = gnome1,
Y = gnome2 ;
false.
于 2013-03-10T21:22:20.973 に答える