0
 are_different(List1,List2):-
    nth0(0,List1,Slot1),
    nth0(0,List2,Slot2),
    Slot1\==Slot2.


fillSchedule([30,_,_,_,_,_,__],S).

fillSchedule([H|T],[H1|T1]):-
    are_different(H,H1),
    H1 = H,
    fillSchedule(T,T1).

fillSchedule([H|T],L):-
    fillSchedule(T,L).

大きな 4170 要素リスト内のリストは次の形式です

[1,A,B,C,D,E,F],[1,A1,B1,C1,D1,F1].......[5,_,_,_,_,_,_].....[30,_,..]

各リストは何らかの形で他のリストとは異なりますが、最も重要な要素である最初の要素 (1)、(2) などは必ずしも必要ではありません。fill Schedule 述語の 1 つの可能な解決策として、30 で構成されるリストが必要です。このような最初の大きなリストから抽出された要素[[1,...],[2,...],[3,...] etc till 30、述語の次のソリューションには、30 個の要素を含むリストの別のリストが含まれている必要がありますが、最初に選択された 30 個の要素とは異なり、元の 4170 個の要素から選択する要素がなくなるまで続きます。

4

2 に答える 2

1
  1. 指定された番号で始まるリストのみを除外する述語を作成します
  2. その述語を使用して30個のリストを作成し、その各メンバーはすべて同じ要素(1..30)で始まります。
  3. 次に、fillScheduleは、これらの30のリストのそれぞれから描画することにより、ソリューションを作成できます。基本ケースはすべてのヘッドを取り、再帰は処理するために30のテールすべてを与えられます。30個のサブリストのうち1つが使い果たされると、fillScheduleは失敗します。
于 2012-04-25T19:37:35.413 に答える
0

別のアプローチを次に示します。

fillSchedule(InL, OutL):-
    numlist(1, 30, Heads),
    fillSchedule(Heads, Heads, InL, [], OutL).

fillSchedule([], _, _, OutL, OutL).
fillSchedule([], Heads, InL, _, OutL):-
  fillSchedule(Heads, Heads, InL, [], OutL).
fillSchedule([Item|TailHeads], Heads, InL, MedL, OutL):-
  select([Item|Rest], InL, NInL),
  % !, This cut would prevent combinations
  fillSchedule(TailHeads, Heads, NInL, [[Item|Rest]|MedL], OutL).

ヘッドを使用してリストを作成し、ヘッドの各項目を持つ入力リストから項目を選択します。コメント化されたカットは、コメントを外すと組み合わせを防ぎます。

于 2012-04-26T15:13:02.527 に答える