2009-12-16 8 views
3

메신저에서 기본적인 프롤로그를 얻으려고 시도했지만 약간 어려움을 겪고 있습니다. 구체적으로 - 항목 목록을 통해 가져 와서 항목별로 항목을 새 목록으로 복사하려고합니다. 나는 그것을 뒤집을 수 있지만 반전없이 그것을하는 것은 속임수임을 알게된다.프롤로그,리스트 복사

필자 시도하고 다음 -

copy(L,R) :- accCp(L,R). 

accCp([],R). 
accCp([H|T],R) :- accCp(T,H). 

내가이에 추적을 실행하면 - 내가 개별 항목에 걸쳐 복사,하지만 그들은 '잃어버린'얻을 볼 수 있습니다, 그리고에 (성장 목록을 형성하지 말아 R, 내가 원했던 것처럼). 어떻게 내가이 일을 끝낼 수 있니?

+0

copy_term/2와 동일한 동작을 원하십니까? – Kaarel

답변

6

귀하의 기본 케이스

많은 감사 원래 목록이 비어있을 때 비울 복사 목록을 설정해야합니다. 당신이 copy를 호출 할 때

copy(L,R) :- accCp(L,R). 
accCp([],[]). 
accCp([H|T1],[H|T2]) :- accCp(T1,T2). 

, 그것은 그것이로 R을 설정하는 기본 케이스, 아래로의 방식으로 작동합니다 : 그런 다음, 재귀 경우 목록 L에서 H을 가지고 목록 R의 머리에 추가 할 필요가 빈 목록. 그런 다음 다시 작동하면서 변수 목록 [H|T2]의 시작 부분에 알려진 목록 [H|T1]의 머리 H을 계속 추가합니다. 원래 케이스에 도달 할 때까지 R에는 L의 전체 사본이 포함됩니다.

+0

감사합니다. 추적을 올바르게 이해하면 accCp ([], _)가 true가 될 때까지 목록을 따라 실행됩니다.이 경우 _가 []로 바뀌고 다시 백업됨에 따라 두 번째 '[]'는 항상 첫 번째 것과 같습니다. 그게 논리인가? 감사합니다. –

+0

네, 맞습니다 - 재귀 적 경우에 H에서 L을 가져 와서 R의 머리에 추가합니다. 그리고 두 목록이 기본 경우에서 동일 (비어 있음)이기 때문에 함수가 끝난. –

+0

대답이 입력 목록에 변수가 들어있는 경우 어떤 일이 발생할지에 대해서도 논의하면 좋을 것입니다. 복사본이 원본과 독립적이지 않아야합니다 (예 : copy_term/2). 또한 목록을 어떻게 열어 복사해야합니까? 테스트 케이스는 예를 들어, "사본 ([A, B, c, A | X], L)" – Kaarel