2011-06-10 2 views
2

필자는 setof/3 및 bagof/3 술어가 문제의 해결 방법 목록을 생성하는 데 사용될 수 있음을 이해합니다. (Link to gprolog manual).Prolog에서 bagof/3과 관련된 문제

예상대로 다음 쿼리에 대한 솔루션은 a, b 및 c입니다.

?- nth(_, [a,b,c], X).     
X = a ? ; 
X = b ? ; 
X = c ? ; 
yes 

그리고 지금 나는 노력이 :

?- setof(X, nth(_, [a,b,c], X), ListOfSolutions). 
ListOfSolutions = [a] ? ; 
ListOfSolutions = [b] ? ; 
ListOfSolutions = [c] 
yes 

이 솔루션은 내 의견으로는 [a, b, c]가되어 있어야합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

Mac OS 용 gprolog 1.4.0을 사용하고 있습니다.


편집 : 솔루션

정말 필요한 것은 무엇 (^)/2 연산자했지만, 여기에 주어진 대답은 완전히 정확했다 당신의 도움을 주셔서 대단히 감사합니다. 비슷한 문제가있는 사람은 현재 코드에서 3 차원 격자에서 셀을 선택하는 것입니다.

% selectFLR(?Grid, ?ClassId, ?TDayIdD, ?HourId, -ListOfFLR) 
% --------------------------------------------------------- 
selectFLR(Grid, ClassId, DayId, HourId, ListOfFLR) :- 
    bagof(FLR, ClassId^DayId^HourId^selectSingleFLR(Grid, ClassId, DayId, HourId, FLR), ListOfFLR). 

selectSingleFLR(Grid, ClassId, DayId, HourId, FLR) :- 
    nth(ClassId, Grid, Class), 
    nth(DayId, Class, Day), 
    nth(HourId, Day, FLR). 

답변

2

아니요. n 번째 (_, [a, b, c], X)는 매번 X에 대해 1 개의 해를 부여합니다. SETOF (및 bagof가)처럼 작동 : (위의 예에서 보여으로)마다 단 하나의 변수는 X 같은 것들을 지정하고, n 번째/3에서 X 인 경우

setof(Things, GoalCondition, Bag) 

, SETOF는 만듭니다 그 단일 변수의리스트. 가능한 다른 통합도 가능하지만 매번 Things에있는 Bag of 1 항목 만 만듭니다.

형식 : 목표의 자유 변수의 개별 바인딩에 대한 조건부 모음 bagof 및 setof. setof는 중복없이 콜렉션의 정렬 된 버전을 산출합니다 ... 모든 자유 변수가있는 bagof와 같은 findall은 자동적으로 존재를 정량화합니다. 또한 findall은 빈 목록 []을 리턴하지만 목표 만족도는 없지만 bagof는 실패합니다.

긴 이야기를 짧게 만들려면 : findall은 사용

+1

내가 findall은/3을 사용할 수 없습니다. 나는 그것들에 유한 한 도메인 제약을 적용하기를 원하기 때문에 이것은 나에게 문제가된다. bagof를 사용하여 솔루션 목록을 생성하는 방법이 있습니까? – Thomas

1

는 다음과 같이 작성하십시오 P : 그것은 익명을 발견 할 때마다 새로운 변수를 생성하기 때문에

findall((A,B,C,D,E), coursemeetings(A,B,C,D,E),L)