2017-03-03 27 views
0

我正在處理作業問題。我試圖獲得所有0和1的唯一排列,其中0和1的數量傳遞給binaryLists/3。我有一套將會得到排列的規則,但是我得到大量的重複項作爲排列/ 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的列表應該是一個空列表。所以只是說:

binaryList(0, 0, []). 

現在,您可以定義兩個規則,這給了在結果列表應該以1開始的條件,當它應以0開始。這些是僅有的兩個額外的規則,你需要:

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中適當的規則定義是什麼使一個有效的列表,然後Prolog的會做的工作,爲您探索所有滿足該規則可能的解決方案的條款。這就是你如何得到所有的排列。排列是獨一無二的,因爲規則在其解決方案中不重疊,並確保每個解決方案都不同。

+0

這解決了我的問題,謝謝你的幫助。我仍然無法將自己置於正確的思維模式之中,所以我很欣賞演練。 – Demonox