これが私の割り当てのコードです。正しく機能していません。それがすべきことは、コードの最初の行に見られるような形で家族の事実を取り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))).