1

나는 대학에서 프롤로그를 배우고, 가정 훈련 중에는 다소 이상하게 들린다.재귀와 결합한 회원

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([],_). 

결국 그것을 채울 것 때문에 :

+0

본질적리스트 무한한 수있는'멤버'OutL'가 가변 인 경우 ((노드 (X), 가장자리), OUTL) '참있다. 프롤로그 프롬프트에서 각 결과 다음에'member (a, L) .'을 (를) 수행하고';'(다음 응답 참조)를 누르면 어떻게되는지보십시오. 또한, 기본 케이스'edgesList ([], _). '가 잘못되었습니다. '_'는 * nothing *을 의미하지 않지만'_'는 익명 변수이므로 * anything *을 의미합니다. '[] '에 대한 가장자리 목록은 어떻게 생겼습니까? 확실히 그것은'_' (아무것도)가 아닙니다. – lurker

답변

1

문제는 절에있다 ... 그것은 다른 excercises 지금 몇 번 무슨 일이 생긴 뭔가 그리고 내가 뭘 잘못했는지 알고 좋은 것 uninstantiated 꼬리가있는리스트 (| _G610).

한가지 해결책은 :

edges(X,Edges):- 
    findall(Edge,(highway(X,Y,Edge);highway(Y,X,Edge)),Edges). 

edgesList([],[]). 
edgesList([node(X)|InL],[(node(X),Edges)|T]):- 
    edges(X,Edges), 
    edgesList(InL,T). 
+0

그래서이 경우 회원을 전혀 사용할 수 없습니까? 회원을 두 개의 빈 목록으로 결합 할 수없는 이유는 무엇입니까? – Programmer1994

+0

문제는 일반적으로 멤버를 사용하는 것이 아니라 멤버와 기본 케이스를 사용하면 두 개의 빈리스트가 제대로 작동하고 기본 케이스가 OutL List와 demand를 전달할 것이라고 생각합니다. 비어있을 수 없으므로 이것이 작동하지 않습니다. – coder

+0

글쎄, 여전히 "회원을 언제 사용해야하는지, 머리를 붙일 지"를 이해하지 못한다.하지만 그 대답은 괜찮았다. 고마워! :) – Programmer1994