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))).
4

1 に答える 1

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).
于 2012-04-27T13:37:07.293 に答える