2012-04-13 3 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

Смежные вопросы