사실 세트 세트/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과 목록을 통합합니다, 동일, 모든 시도 :
'findall/3' 대신'setof/3'을 사용하십시오. 'setof/3'는 자동으로 정렬됩니다. – lurker
'repeat/0' 또는'doSort/1'을 사용할 필요가 없습니다; 'sort/2'는 스스로 일을 할 것입니다. (나는 여전히 @ lurker의 솔루션을 선호 할 것이다). –
주문/2의 두 번째 ('repeat') 및 세 번째 ('doSort (List) ') 목표를 제거하면 예제 쿼리가 원하는 결과를 정확하게 산출합니다. – tas