0

始める前に、ここに問題があります。

List Xs = [1,2,3] と List Ys = [2,3,4] の例があります。これら 2 つのリストの 2 つの共通要素メンバーは [2,3] です。したがって、述語setIntersection(Xs, Ys, Zs)を作成しようとしています。結果のリスト ( [2,3] ) は Zs にバインドされます。Prolog 言語を使用してこれを実行しようとしています。 Windows 上の ECLiPSe プログラムで実行され、ループ反復子 NO RECURSIONを使用する必要があります。

これが私がこれまでに持っているコードです:

setIntersection(Xs, Ys, Zs) :-
    ( foreach(Alpha, Xs), fromto([Ys], [Head|Tail], Tail, []), foreach(Bravo, Ys)
        do
             ( (Alpha =:= Head)
                   -> Bravo = Head;
                   fail
             )
    ).

私が持っているコードの別のバージョンはこれです:

setIntersection(Xs, Ys, Zs) :-
    ( foreach(Alpha, Xs), param(Ys, Zs)
        do
             ( foreach(Bravo, Ys), foreach(Charlie, Zs), param(Alpha)
                   do
                         ( ( Alpha =:= Bravo)
                            -> Charlie is Alpha;
                            !
                         )
             )
    ).

結果 (2 番目のコードから):

?- setIntersection([1,2,3], [2,3,4], X).
X = [2, 3, _412]
Yes (0.00s cpu)

私が得た結果は、上記のコードでは非常に奇妙です。

この問題で私を助けてください、私はとても感謝しています。ありがとうございました!

4

1 に答える 1

2

ECLiPse 宣言ループを使用してこれを行う必要があると思いますが、念のため: intersection/3ECLiPSe で既に実装されていることを知っていますか?

[eclipse]: intersection([1, 2, 3], [2, 3, 4], X).
X = [2, 3]
Yes (0.00s cpu)

そして、これはループでそれを行う多くの方法の1つです:

setIntersection(Xs, Ys, Zs) :-
    ( foreach(Xi, Xs), fromto([], ZsPrev, ZsCurr, Zs), param(Ys) do
        ( memberchk(Xi, Ys)  -> 
            ZsCurr = [Xi | ZsPrev]
        ;
            ZsCurr = ZsPrev
        )
    ).

テスト走行:

[eclipse]: setIntersection([1,2,3], [2,3,4], X).
X = [3, 2]
Yes (0.00s cpu)

要素は、例で示したものとは逆の順序になっていますが、セットでは問題ありません。必要に応じて、最後に要素を逆にしたり並べ替えたりできます。

ところで、質問のヘッダーに「Perl」があるのはなぜですか?

于 2014-04-29T00:54:57.530 に答える