2012-04-13 8 views
0

Hier ist mein Code für meine Aufgabe, es funktioniert nicht richtig. Was es tun soll, ist eine Familien-Tatsache in Form von family(Title,[Name/Speed|_]) nehmen, wie in der ersten Zeile des Codes zu sehen und produzieren alle möglichen Ergebnisse des bekannten Bridge-Puzzle mit der Taschenlampe. Alles, was es sagt, ist jedoch wahr oder falsch, abhängig davon, ob die Familien-Tatsache da ist oder nicht. Dieses Programm arbeitet völlig in Ordnung, wenn alle Fakten zum Beispiel angelegt werdenProlog Puzzle, kann Fehler nicht finden

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

wenn^im Code ist, und die letzten assert_family beseitigt wird der Code gut ist. Es ist also etwas damit zu tun, dass die assert_family nicht richtig benutzt wird.

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

Was bedeutet "es funktioniert nicht" genau? Sie haben uns nicht gesagt, was die Aufgabe ist oder was nicht, deshalb ist es unmöglich, Ihnen zu sagen, warum. Bitte bearbeiten Sie Ihre Frage, um die fehlenden Informationen zur Verfügung zu stellen, so dass hier eine Frage beantwortet werden muss. Wenn Sie das tun, denken Sie bitte daran, dass wir Ihre Gedanken nicht lesen können oder Ihre Aufgaben von hier aus sehen - alles, was wir wissen, ist, was Sie uns hier sagen. Vielen Dank. :) –

+0

yeah no problem – user1204349

+0

Sollte 'Person + Zeit' nicht' Person-Zeit' sein? Das ist das einzige Problem, das ich sehen kann. – twinterer

Antwort

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

Netter Versuch, aber fügen Sie einige Informationen hinzu, um effektiver zu präsentieren. – RobinHood