2012-01-25 2 views
0

아래에 언급 한 바와 같이이 all_neighbours 모든 이웃 마을의리스트 L을 반환 (L, X) 올바른 절차겠습니까이웃, 마을, 댐, 링크 관계 프롤로그 프로그램에서

town(a). 
town(b). 
town(c). 
town(d). 
dam(e). 
dam(f). 
link(a,b). 
link(a,c). 
link(c,d). 
link(b,d). 
link(b,c). 
link(c,e). 
link(a,e). 
link(d,f). 
neighbour(X,Y):- link(X,Y) ; link(Y,X). 

X : all_neighbours (L, X) : - 도시 (Y), findall (Y, 이웃 (X, Y), L). 댐 (Y), 마을 (X) - : has_dam (L) :

이 올바른 절차 has_dam (L) 적어도 하나의 이웃 댐이있는 모든 도시의리스트 L을 반환 있을까 findall (X, 이웃 (X, Y), L).

이 올바른 절차 에는 이웃 댐이없는 모든 도시의리스트 L 반환 no_dam (L) 다음과 같습니다 no_dam (L) : - 마을 (X)를, (Y)를 댐하지, findall은 (X, 이웃 (X, Y), L).

답변

1

아니요, 이들 중 어느 것도 정확하지 않습니다. 나머지 유사

all_neighbours(Neighbourhood, X) :- 
    findall(Y, (town(Y), neighbour(X, Y)), Neighbourhood). 

과 : 첫 번째에서, town에 대한 호출은 findall의 범위 내에서 수행해야합니다. 두 번째 인수 주변의 괄호는 findall입니다. 이들은

findall(Y, town(Y), neighbour(X, Y), Neighbourhood) 

가합니다 (아마 존재하지 않는) findall/4의 호출로 해석 될 수 있기 때문에, 필요합니다.

이 (Y는 도시와 X 이웃 Y가) 모든 Y 같은 것을 발견하고 그 결과 Neighbourhood 전화 :

findall 쿼리를 이해하기 위해서는 밖으로 철자.