1

パッケージとバージョンのリストを取得するプログラムを作成しようとしています。候補セットに競合するバージョンがない場合は、trueである必要があります。つまり、異なるバージョンでリストされているパッケージがない場合です。

?- conflict_free([cython, gcc, gcc], ['0.11.2', '4.4.3', '4.4.3']).
true.

?- conflict_free([cython, gcc, gcc], ['0.11.2', '4.4.3', '4.4.0']).
false.

?- conflict_free([gfortran, gcc, libc6, libc6], ['4.4.3', '4.4.3', '2.11.1', '2.11.1']).
true.

?- conflict_free([gfortran, gcc, libc6, libc6], ['4.4.3', '4.4.3', '2.11.1', '2.7.3']).
false.

position / 4を使用して、次のように動作する繰り返し要素のインデックスを見つけようとしました。

?- positions([a, b, c, b, c, a, d, b, c], b, Posn, 0).
Posn = [1, 3, 7].

?- positions([cython, gcc, gcc], gcc, Posn, 0).
Posn = [1, 2].

再帰的に使用position/4して、戻り値Posnが> =2であるかどうかを確認してから、バージョンリストのインデックスを使用して、別のバージョンがあるかどうかを確認しました。しかし、それは私にとってはうまくいきませんでした...

助言がありますか?

4

2 に答える 2

1

まず、リストを見てみましょうzip。それらを組み合わせてペアのリストにします。

?- pairs_keys_values(PkgVer, [cython, gcc, gcc], ['0.11.2', '4.4.3', '4.4.3']).
PkgVer = [cython-'0.11.2', gcc-'4.4.3', gcc-'4.4.3'].

pairs_keys_valuesProlog にない場合でも簡単に実装できます。ここで、重複するキーと値のペアを取り除きます。

?- pairs_keys_values(PkgVer, [cython, gcc, gcc], ['0.11.2', '4.4.3', '4.4.3']),
|    list_to_set(PkgVer, S).
PkgVer = [cython-'0.11.2', gcc-'4.4.3', gcc-'4.4.3'],
S = [cython-'0.11.2', gcc-'4.4.3'].

これは SWI-Prolog predicate を使用しlist_to_set/2ます。も使用できますsort/2。セットを解凍します。

?- pairs_keys_values(PkgVer, [cython, gcc, gcc], ['0.11.2', '4.4.3', '4.4.3']),
|    list_to_set(PkgVer, S),
|    pairs_keys_values(S, Packages, _).
PkgVer = [cython-'0.11.2', gcc-'4.4.3', gcc-'4.4.3'],
S = [cython-'0.11.2', gcc-'4.4.3'],
Packages = [cython, gcc] .

最後に、 がPackagesSWI のis_set述語またはその再実装を含むセットであるかどうかを確認できます (ヒント:sort/2リスト、次に長さが変化するかどうかを確認します)。そう、

conflict_free(Packages, Versions) :-
    pairs_keys_values(PkgVer, Packages, Versions),
    list_to_set(PkgVer, PkgVerSet),
    pairs_keys_values(PkgVerSet, PkgSet, _),
    is_set(PkgSet).
于 2012-08-01T11:37:50.997 に答える
0

ここに簡単な実装があります:

conflict_free(Packages, Versions) :-
    \+ (nth1(I, Packages, P),
        nth1(I, Versions, A),
        nth1(J, Packages, P), J \= I,
        nth1(J, Versions, B), A \= B ).

テスト:

?- conflict_free([cython, gcc, gcc], ['0.11.2', '4.4.3', '4.4.3']).
true.

?- conflict_free([cython, gcc, gcc], ['0.11.2', '4.4.3', '4.4.0']).
false.

?- conflict_free([gfortran, gcc, libc6, libc6], ['4.4.3', '4.4.3', '2.11.1', '2.11.1']).
true.

?- conflict_free([gfortran, gcc, libc6, libc6], ['4.4.3', '4.4.3', '2.11.1', '2.7.3']).
false.

nth1/3 は、Package と Version を Position でペアにするために使用されるため、ルールは次のように読み取ることができます。

異なるバージョンでリストされているパッケージはありません

于 2012-08-01T13:52:15.133 に答える