私はこれのような行く人気の問題をしようとしています。プロログ無限の人々とブリッジパズル
4の家族が夜間に橋を渡ろうとしています。 1つは橋を渡るために懐中電灯が必要で、2人だけが同時に2人のうちの遅い方の速度で動いてブリッジを横切ることができます。父は1分で橋を渡り、2分で母親、5分で子供を、そして10歳でおばあちゃんを渡ります。彼らが橋を渡る最速の方法は何ですか?
私は、家族が橋を渡る可能性のあるすべての方法と、それぞれの方法がかかる時間を見つけなければなりません。家族はそれには何人もの人を持つことができます。
私はこのコードを持っていますが、私はなぜ動作しないのか分かりません。
cross(Max, Plan):-
touristList(Ts),
Ts = [Single] -> time(Single, Time),
Time =< Max,
Plan = [[Single]];
solve_left(s(Ts,[]),Max,Plan,[]).
touristList([t1,t2,t3,t4]).
time(t1,6).
time(t2,7).
time(t3,10).
time(t4,15).
member_rest(E,[E|Es],Es).
member_rest(M,[E|Es],[E|Rest]):-
member_rest(M,Es,Rest).
solve_left(s(Lefts0,Rights0),Time0,Plan0,Plan):-
member_rest(T1,Lefts0,Lefts1),
member_rest(T2,Lefts1,Lefts2),
time(T1,TT1),
time(T2,TT2),
Time1 is Time0 - max(TT1,TT2),
Time1 >= 0,
Plan0 = [[T1,T2]|Rest],
solve_right(s(Lefts2,[T1,T2|Rights0]),Time1,Rest,Plan).
solve_right(s(Lefts0,Rights0),Time0,Plan0,Plan):-
Lefts0 == [] -> Plan0 = Plan;
member_rest(T,Rights0,Rights1),
time(T,TT),
Time1 is Time0 - TT,
Time1 >= 0,
Plan0 = [[T]|Rest],
solve_left(s([T|Lefts0],Rights1),Time1,Rest,Plan).
私はこれを試してみました:このありえないが動作する理由
ruleMaker(Name) :-
family(Name,[Title/Speed|_]),
person(Title,Speed).
moveFamily(Name,Journey, TotalTime):-
ruleMaker(Name),
findall(Person-Time, person(Person, Time), Left),
moveFamily(Left, [], Journey),
findall(Time, member([Time|_], Journey), LTime),
sumlist(LTime, TotalTime).
誰かが私に教えてもらえますか?
私はあなたが自分自身でそれを働かせることができるので、ここに解決策を与えますが、ここではいくつかの提案を行くわけではない
これは宿題であれば、あなたがやったとあなたの解決策の問題は、何が何であるかを私たちに示すべきです。 – gusbro
まあ、私は述語を始めることに問題があります。これらのパラメータを持つ必要があります。 1.家族の名前(家族の事実に示されている) - 縛られている必要があります。 2.川の向こう側に家族を連れて行くことのあるリスト - 縛られていないことが必要です 3.移動の順序あなたの解決策はif-then-else構造に問題があるようです。 – user1204349
ありがとうございました。 – gusbro