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

관련 문제