2012-04-23 15 views
2

데이터베이스가 있습니다.SWI-Prolog 목록 및 재귀

airport(ist, 90). 
airport(saw, 45). 
airport(esb, 60). 
airport(adb, 60). 
airport(erz, 30). 
airport(ayt, 90). 
airport(mlx, 30). 
airport(tzx, 30). 

airplane(f1, ist, [esb,tzx,saw]). 
airplane(f2, ist, [mlx,esb,erz,esb]). 
airplane(f3, ist, [esb,ist,esb,ist]). 
airplane(f4, saw, [ayt,saw,ayt,saw]). 
airplane(f5, erz, [esb,erz,esb]). 
airplane(f6, mlx, [ist,esb,tzx,saw]). 

"테스팅"이라는 술어에는 매개 변수로 두 개의 목록이 있습니다. 그래서, 당신이 테스트를 작성한다면 ([ist], X). 당신은 X = [esb, mlx]를 얻어야합니다. 나는이 코드를 썼다.

testing([],[]). 

testing([D|D1],[L|L1]) :- 
    airport(D,_), 
    airplane(_,D,[L|_]), 
    testing(D1,L1). 

이 작동하고, 출력은 다음과 같습니다

[8] 60 ?- listConnections([ist],X). 
X = [esb] ; 
X = [mlx] ; 
X = [esb]. 

을하지만 내가 원하는 것이 아니다. 그래서 첫 번째 문제는 X = [esb, mlx]와 같은 한 줄의 답이 필요하다는 것입니다. 두 번째 문제는 목록에 요소를 중복해서는 안됩니다. 내 문제가 분명해지기를 바랍니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

3

당신은 setof/3를 사용할 수 있습니다

testing_set(List, Result) :- 
    setof(L, testing(List, L), Result). 

당신이 this SWI-Prolog documentation page 인 관심을 가질만한 페이지입니다.

[esb,mlx]은 아니지만 [[esb], [mlx]]을 반환한다는 점에 유의하십시오.

+0

덕분에 모그! (: – bleda