2017-11-06 3 views
0

사실 세트 세트/2가 있습니다. 여기서 첫 번째 변수는 세트의 식별자이고 두 번째 변수는 식별자와 관련된 값입니다. 예를 들어
는 :반복을 사용하여 프롤로그에서 팩트 컬렉션을 정렬합니다.

set(a,2). 
set(a,c). 
set(a,1). 
set(a,a). 
set(a,3). 
set(a,b). 

I는 출력 할 특정 세트의 값을 자신의 사전 식 순서 (반복 연산자를 사용)/2 주문 술어를 구성 할 필요가있다. 예를 들어

?- ordering(a,Output). 

내가 지금까지 만든 어떤

[1,2,3,a,b,c]. 

초래 하면이 코드 :

ordering(Input,Output):-  
    findall(X,set(Input,X),List), 
    repeat, 
    doSort(List) 
    sort(List, OrderedList), 
    Output = OrderedList. 

여기 아이디어는 술어의 모든 값을 찾을 것입니다 특정 Input과 연결된 List 변수와 List 변수를 통합합니다. 이제 정렬되지 않은 목록이 있습니다. 여기 내가 완전히 확신 할 수없는 부분이 있습니다. 술어는 List에서 특정 doSort를 계속 사용하고 sort/2를 사용하여 목록을 확인하고 사전 편집 된 경우 출력과 통합합니다.

올바른 경로에 있는지 누군가가 명확히 알 수 있습니까? 그렇다면 어떻게 doSort를 구현해야합니까?

ordering(Input,Output):-  
    findall(X,set(Input,X),List), 
    repeat, 
    permutation(List,PermutationList), 
    sort(PermutationList, SortedList), 
    Output= SortedList , !. 

일반적인 생각은 반복주기, 술어가 PermutationList과 목록을 통합합니다, 동일, 모든 시도 :

+4

'findall/3' 대신'setof/3'을 사용하십시오. 'setof/3'는 자동으로 정렬됩니다. – lurker

+4

'repeat/0' 또는'doSort/1'을 사용할 필요가 없습니다; 'sort/2'는 스스로 일을 할 것입니다. (나는 여전히 @ lurker의 솔루션을 선호 할 것이다). –

+2

주문/2의 두 번째 ('repeat') 및 세 번째 ('doSort (List) ') 목표를 제거하면 예제 쿼리가 원하는 결과를 정확하게 산출합니다. – tas

답변

0

좋아, 나는이 사용 @Daniel 리옹의 도움을 대답하는 일종의 시도 그것의 변종과 정확한 순열을 달성 할 때까지 sort/2로 그 정확성을 확인하고, SortedList로 단일화 한 후, SortedList로 출력을 단일화합니다. 커팅은 거기 있으므로 출력을 한 번만 얻습니다.

+0

'sort/2'를 사용하고 전체를 잊을 수 있습니다. 더 나은 방법은, findall 대신에'setof/3'을 사용하여 하나의 목표로 전체 술어를 표현하는 것입니다. – mat

0
?- % init test DB 
| maplist([X]>>assert(set(a,X)), [c,b,a,1,2,3]). 
true. 

?- % find first 
| set(a,X), \+ (set(a,Y), Y @< X). 
X = 1 ; 
false. 

?- % find next, given - hardcoded here as 1 - previous 
| set(a,X), X @> 1, \+ (set(a,Y), Y @> 1, Y @< X). 
X = 2 ; 
false. 

이제 우리는 이러한 쿼리를 만들기 위해 노력하고 있습니다 재사용 :

ordering(S,[H|T]) :- first(S,H), ordering(S,H,T). 

first(S,X) :- set(S,X), \+ (set(S,Y), Y @< X). 
next(S,P,X) :- set(S,X), X @> P, \+ (set(S,Y), Y @> P, Y @< X). 

ordering(S,P,[X|T]) :- next(S,P,X), ordering(S,X,T). 
ordering(_,_,[]). 

가 정확하기 위해, 우리는 어딘가에 상처를해야합니다. 그 장소를 발견 할 수 있니?