2012-04-13 2 views
0

Voici mon code pour mon devoir, il ne fonctionne pas correctement. Ce qu'il est censé faire est de prendre un fait de famille sous la forme de family(Title,[Name/Speed|_]) comme vu dans la première ligne de code et de produire tous les résultats possibles du puzzle de pont bien connu avec la lampe de poche. Cependant, tout ce qu'il dit est vrai ou faux, selon que le fait familial existe ou non. Ce programme fonctionne parfaitement bien si tous les faits sont disposés par exemplepuzzle prolog, impossible de trouver l'erreur

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

quand^est dans le code, et le dernier est éliminé assert_family le code est bon. C'est donc quelque chose à voir avec le assert_family qui n'est pas utilisé correctement.

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

Qu'est-ce que "ça ne marche pas" signifie exactement? Vous ne nous avez pas dit quelle est la tâche ou ce qui ne fonctionne pas, il est donc impossible de vous dire pourquoi. Veuillez éditer votre question pour fournir l'information manquante afin qu'il y ait une question à laquelle il faut répondre ici. Quand vous le faites, s'il vous plaît rappelez-vous que nous ne pouvons pas lire votre esprit ou voir vos devoirs d'ici - tout ce que nous savons est ce que vous nous dites ici. Merci. :) –

+0

ouais pas de problème – user1204349

+0

Est-ce que 'Person + Time' ne devrait pas être' Person-Time'? C'est le seul problème que je peux voir. – twinterer

Répondre

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

Bien essayé, mais ajoutez quelques infos à présenter plus efficacement. – RobinHood