2012-04-13 31 views
0

私の割り当てのための私のコードは、正しく動作していません。 これは、コードの最初の行に示されているように、家族の事実をfamily(Title,[Name/Speed|_])の形で取り、よく知られているブリッジパズルの可能な結果を​​懐中電灯で作り出すことです。しかし、家族の事実が存在するかどうかに応じて、それは真実か偽であると言われています。 すべての事実が プロローグパズル、エラーが見つかりません

person(dad,1) person(mom,2) person(kid,5) person(granny,10)

^がコードである例

のためにレイアウトされている場合は、このプログラムは完全に正常に動作し、そして最後 assert_familyは、コードが良いです解消されます。 これは、 assert_familyが正しく使用されていないことと関連しています。

family(original, [father/1,mother/2,child/5,granny/10]). 

moveFamily(Key,Journey, TotalTime):- 
     assert_family(Key), 
     findall(Person+Time, person(Person, Time), Left), 
     moveFamily(Left, [], Journey), 
     findall(Time, member([Time|_], Journey), LTime), 
     sumlist(LTime, TotalTime). 

    moveFamily([P1-T1, P2-T2], _, [[T, [P1-P2]]]):- 
     T is max(T1, T2). 
    moveFamily(Left, Right, [[LT, [P1-P2]],[RT, [P3]]|Journey]):- 
     select(P1-T1, Left, MLeft1), 
     select(P2-T2, MLeft1, MLeft2), 
     LT is max(T1, T2), 
     select(P3-RT, [P1-T1,P2-T2|Right], MRight), 
     moveFamily([P3-RT|MLeft2], MRight, Journey). 

    :- dynamic person/2. 
    assert_family(Key) :- 
     family(Key,List), 
     forall(member(N/V,List), 
       assertz(person(N,V))). 
+0

正確に何を意味 "それは動作しません" ん?あなたは、課題が何であるか、何がうまくいかないかを教えてくれていないので、なぜあなたに話すことは不可能です。不足している情報を提供するためにあなたの質問を編集して、ここで質問に答えてください。あなたがそうするとき、私たちはあなたの心を読んだり、ここからあなたの課題を見ることができないことを覚えておいてください。ありがとう。 :) –

+0

ええ、問題ありません – user1204349

+0

'Person + Time'は' Person-Time'ではないでしょうか?それが私が見ることができる唯一の問題です。 – twinterer

答えて

0
% this seems to work: 

% LPA WIN-PROLOG 4.010 on mac with WinOnX 

family(original, [father/1,mother/2,child/5,granny/10]). 

moveFamily(Key,Journey, TotalTime):- 
     assert_family(Key), 
     findall(Person-Time, person(Person, Time), Left), % changed+ 
     moveFamily(Left, [], Journey), 
     findall(Time, member([Time|_], Journey), LTime), 
     sumlist(LTime, TotalTime). 

moveFamily([P1-T1, P2-T2], _, [[T, [P1-P2]]]):- 
    T is max(T1, T2). 

moveFamily(Left, Right, [[LT, [P1-P2]],[RT, [P3]]|Journey]):- 
    select(P1-T1, Left, MLeft1), 
    select(P2-T2, MLeft1, MLeft2), 
    LT is max(T1, T2), 
    select(P3-RT, [P1-T1,P2-T2|Right], MRight), 
    moveFamily([P3-RT|MLeft2], MRight, Journey). 

%:-dynamic(person/2). 

assert_family(Key) :- dynamic(person/2), 
    family(Key,List), 
    forall(member(N/V,List), 
      assertz(person(N,V))). 

select(H,[H|T],T). 
select(X,[H|T],[H|T1]):-select(X,T,T1). 

sumlist(L,Sum) :- 
sumlist(L,0,Sum). 
sumlist([],Sum,Sum). 
sumlist([H|T],Count,Sum) :- 
NewCount is Count + H, 
sumlist(T,NewCount,Sum). 
+0

ニースを試してみましょう。しかし、より効果的に提示するためにいくつかの情報を追加してください。 – RobinHood

関連する問題