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