2012-03-11 2 views
2

나는 프롤로그에서 가장 낮은 가장 높은에서 자신의 나이 —에 의해 친척의 목록을 주문하려고 : [kate,marc,I,michel,harry,jess,ruth,fran] :프롤로그에서 연령 목록을 어떻게 분류합니까?

born(kate,date(11,2,1960)). 
born(marc,date(11,2,1961)). 
born(I,date(9,3,1962)). 
born(michel,date(24,4,1963)). 
born(harry,date(26,5,1964)). 
born(jess,date(16,1,1965)). 
born(ruth,date(26,9,1966)). 
born(fran,date(4,3,1967)). 

결과는 하나 개의 목록이어야한다.

나는 @CapelliC하여이 코드 조각을 시도해보십시오

pairs_values([], []). 
pairs_values([_-V|T0], [V|T]) :- 
    pairs_values(T0, T). 

by_date(Sorted) :- 
    findall(Date-Person, born(Person,Date), List), 
    keysort(List, Pairs), 
    pairs_values(Pairs, Sorted). 

하지만이 코드는 주문하지 않습니다. Ciao Prolog에서해야합니다.

+2

및 downvote의 이유는 ...? –

답변

2

우리는 몇 가지 내장하여, SWI - 프롤로그에서 작업을 수행 할 수 있습니다

by_date(Sorted) :- 
    findall(Date-Person, born(Person,Date), List), 
    keysort(List, Pairs), 
    pairs_values(Pairs, Sorted). 

편집 : 그것은 pairs_values ​​정말 간단하다 : 여기에 SWI - 프롤로그가

%% pairs_values(+Pairs, -Values) is det. 
% 
% Remove the keys from a list of Key-Value pairs. Same as 
% pairs_keys_values(Pairs, _, Values) 

pairs_values([], []). 
pairs_values([_-V|T0], [V|T]) :- 
    pairs_values(T0, T). 
+0

"ciao 프롤로그"에서이 방법을 시도했지만 "존재 오류 : 프로 시저 : 사용자 : pairs_values ​​/ 2가 존재하지 않습니다." – user1257941

+0

"ciao Prolog"에서 수행해야합니다. – user1257941

+1

더 쉽게 :'findall (날짜 -P, 태어난 (P, 날짜), L0), keysort (L0, L1), findall (P, member (_-P, L1), L2) .' –

2

TL을 니펫을, DR :의 시퀀스는이며 예상하지 못한 정렬 기준에 따라 —으로 정렬되었습니다.

Ciao Prolog을 실행하고 OP가 관찰 한 이상한 동작을 재현 해 봅니다! 관찰 [kate,marc,I,michel,harry,jess,ruth,fran]

  • : [fran,_,kate,marc,jess,michel,harry,ruth]
  • 이의이 같은 사실을 순서하자

    $ ciao 
    Ciao 1.14.2-13646: Mon Aug 15 10:15:33 CEST 2011 
    ?- compile(dmy_vs_ymd). 
    {Reading /home/stefan/Prolog/dmy_vs_ymd.pl 
    WARNING: (lns 3-3) [I] - singleton variables in born/2 
    } 
    yes 
    ?- by_date(S). 
    S = [fran,_,kate,marc,jess,michel,harry,ruth] ? ; 
    no 
    

    은 모든 단일 요소이 — 꽤 상당한 차이 : 예상

    • 를 잘못되어 나타납니다 [fran,_,kate,marc,jess,michel,harry,ruth] 검토 :

       
      born(fran , date(4, 03, 1967)). 
      born(I  , date(9, 03, 1962)). 
      born(kate , date(11, 02, 1960)).%\_______________________________________________ 
      born(marc , date(11, 02, 1961)).%/ equal primary & secondary, different tertiary 
      born(jess , date(16, 01, 1965)). 
      born(michel, date(24, 04, 1963)). 
      born(harry , date(26, 05, 1964)).%\____________________________________ 
      born(ruth , date(26, 09, 1966)).%/ equal primary, different secondary 
      %     ^^ ^^ ^^^^ 
      %     || || |||| 
      %     || || \+++------- tertiary sorting criterion 
      %     || || 
      %     || \+------------ secondary sorting criterion 
      %     || 
      %     \+------------------ primary sorting criterion 
      

      키? 표준 용어의 표준 순서!하여 Ciao Prolog manualrelevant part 인용 :

      Compound terms, ordered first by arity, then by the name of the principal functor, then by the arguments in left-to-right order. Recall that lists are equivalent to compound terms with principal functor '.'/2 .

      by_date/1의 정의에 목표 findall(Date-Person, born(Person,Date), List)을 고려하십시오. DatePerson 앞에 넣으면 Date-Person이 기본 기준이됩니다. 화합물 용어 2 개를 비교하기 위해 표준 순서가 사용됩니다.

      용어의 표준 순서 두 date/3 화합물의 상대적 위치를 결정하기 위해, 프롤로그 세 기준 최대 사용

      1. Day : DayMonth 결정적이며 Year 두 무관 한 경우.

      2. Month : Day이 우유부단하지만, Month가 결정적인 경우, Year는 무관하다.

      3. Year : 경우에만 DayMonth은 모두 우유부단, Year 심지어 보았다된다 있습니다.

      So, can we solve the "sort by decreasing age" problem? And how?

      예! ISO 8601을 따르고 date(Day,Month,Year)에서 date(Year,Month,Day)으로 마이그레이션하십시오!

       
      born(fran ,date(1967,3, 4)). 
      born(I,  date(1962,3, 9)). 
      born(kate ,date(1960,2,11)). 
      born(marc ,date(1961,2,11)). 
      born(jess ,date(1965,1,16)). 
      born(michel,date(1963,4,24)). 
      born(harry, date(1964,5,26)). 
      born(ruth, date(1966,9,26)). 
      

      샘플 쿼리 :

      ?- by_date(S). 
      S = [kate,marc,_,michel,harry,jess,ruth,fran]. 
      

      흠 ... 우리는 아직 있습니까?

      • 예상 : [kate,marc,I,michel,harry,jess,ruth,fran]
      • 관찰 : [kate,marc,_,michel,harry,jess,ruth,fran]

      그렇진 100 % ... I는 우리가 실제로 일정한 원 변수 —이다; 원자 i으로 바꿉니다. 이 시크릿 변수는 Ciao Prolog 세션이 시작될 때 우리가 얻은 경고 인 "singleton variable"을 얻은 이유입니다. HTH!

    관련 문제