나는 대학에서 프롤로그를 배우고, 가정 훈련 중에는 다소 이상하게 들린다.재귀와 결합한 회원
edges(X,Edges):-
findall(Edge,(highway(X,Y,Edge);highway(Y,X,Edge)),Edges).
edgesList([],_).
edgesList([node(X)|InL],OutL):-
member((node(X),Edges),OutL),
edges(X,Edges),
edgesList(InL,OutL).
사용 다음과 같은 사실 :
highway(1,2,yellow).
highway(2,3,blue).
highway(1,3,yellow).
당신은 처음 두 인수에 두 개의 노드를 설명하는 사실로 고속도로를 볼 수 있습니다 나는 훨씬 더 큰 프로그램의 일부 프롤로그 절, 다음 썼다 그리고 세 번째에있는 가장자리. 모든 사실들이 함께 연결된 그래프를 형성합니다.
절 가장자리 목록을 사용하여 노드 당 가장자리를 나열하려고합니다.
Result = [(node(1),[yellow,yellow]),(node(2),[blue,yellow]),(node(3),[blue,yellow])]
하지만 내 쿼리를 작성할 때 :
어떤 이유List = [(node(1),[yellow, yellow]), (node(2),[blue, yellow]), (node(3),[blue, yellow])|_G610]
, 프롤로그는 결과-목록의 꼬리를 통합하지 않습니다
edgesList([node(1),node(2),node(3)],List).
을 나는 다음과 같은 결과를 얻을 수 빈 목록은 구성원 술어가 올바르다는 사실에도 불구하고 가정합니다.
edgesList([],_).
결국 그것을 채울 것 때문에 :
본질적리스트 무한한 수있는'멤버'OutL'가 가변 인 경우 ((노드 (X), 가장자리), OUTL) '참있다. 프롤로그 프롬프트에서 각 결과 다음에'member (a, L) .'을 (를) 수행하고';'(다음 응답 참조)를 누르면 어떻게되는지보십시오. 또한, 기본 케이스'edgesList ([], _). '가 잘못되었습니다. '_'는 * nothing *을 의미하지 않지만'_'는 익명 변수이므로 * anything *을 의미합니다. '[] '에 대한 가장자리 목록은 어떻게 생겼습니까? 확실히 그것은'_' (아무것도)가 아닙니다. – lurker