2017-03-03 19 views
0

私は宿題の問題に取り組んでいます。私は0と1の数がbinaryLists/3に渡される0と1のすべてのユニークな順列を取得しようとしています。私は順列を得る一連の規則を持っていますが、順列/ 2はそれぞれ0と1を一意的に扱うので、多数の重複を得ます。私はどこかにカットを入れる必要があるように感じますが、私は実際にカットを理解していないので、これについてどう考えるべきか分かりません。私のコードは次のようになります:gprologのリストのユニークな順列を見つける

binaryLists(0, 0, R). 
binaryLists(Z, O, R) :- 
    Z >= 0, O >= 0, 
    generateZero(Z, Lz), 
    generateOne(O, Lo), 
    append(Lz, Lo, Tmp), 
    permutation(Tmp, R). 

generateZero(0, R) :- 
    R = []. 
generateZero(Z, R) :- 
    Z > 0, 
    Y is Z - 1, 
    generateZero(Y, Tmp), 
    append(Tmp, [0], R). 

generateOne(0, R) :- 
    R = []. 
generateOne(Z, R) :- 
    Z > 0, 
    Y is Z - 1, 
    generateOne(Y, Tmp), 
    append(Tmp, [1], R). 

この結果、同じリスト(例:[1,0,0,0])は多く複製されます。

答えて

1

ここではカットされません。それは、過度に複雑で手続き的なルールを作ってから、カットを使って物事を修正しようとする一般的なProlog初心者のミスです。

ここにいくつかのヒントがあります。 append/3permutation/2は不要で、0/1リストジェネレータは必要ありません。

最初のルールは正しいトラックにありますが、欠陥があります。あなたはシングルトンRを持っています。 0の0と0のリストが空のリストでなければならないと言っています。あなたは結果のリストが1で始まる必要がある場合のための条件を与える2つのルールを定義することができます今すぐ

binaryList(0, 0, []). 

、それが0で始まる必要がある場合、これらは2つのだけ追加ルール、あなたは以下のとおりです。だからと言って必要性:

binaryList(Zeroes, Ones, [0|R]) :- 
    Zeroes > 0, 
    ... % What goes here? 
    binaryList(..., Ones, R). % What goes in place of ...? 

binaryList(Zeroes, Ones, [1|R]) :- 
    Ones > 0, 
    ... % What goes here? 
    binaryList(Zeroes, ..., R). % What goes in place of ...? 

あなたが有効なリストを作るかを定義プロローグで適切なルールを作成したら、その後、Prologはルールを満たす可能な解決策のすべてを探索するという点であなたのための作業を行います。それはあなたがすべての順列を得る方法です。ルールはソリューション内で重複していないため、各ソリューションが異なることを保証するため、パーミュテーションはユニークです。

+0

これは私の問題を解決し、助けてくれてありがとう。私はまだプロビジョナルでプログラムする正しい考え方に自分自身を入れるのに困っているので、私はウォークスルーを感謝します。 – Demonox

関連する問題