2010-03-28 2 views
4

다른 목록 (L)의 요소를 하나씩 추가하여 목록 (L2)을 만들고 싶습니다. 결과는 입력과 정확히 일치해야합니다. 이 작업은 어리석은 일이지만 목록을 통해 재귀하고 특정 요소를 제거하는 방법을 이해하는 데 도움이됩니다.재귀와 프롤로그에서의 추가 사용

create([1,2,3,4], L2) 

반환

원하는 결과 아닙니다
L2 = [1|create([2,3,4], **)\. 

하여 호출

create(L, L2) :- (\+ (L == []) -> L=[H|T], append([H], create(T, L2), L2);[]). 

:

내가 함께 다음과 같은 코드를 삽입했다.

답변

3

당신은 프롤로그가 어떻게 작동하는지 이해하기를 원하므로 완전한 해결책을 제공하지는 않지만 힌트를 제공 할 것입니다.

프롤로그의 함수는 값을 반환하지 않고 단지 바인딩을 만듭니다.

당신이 반환 값을 사용하려고

append([H], create(T, L2), L2);[]). 

당신이 말할 때.

재귀 호출에서 사용하는 추가 바인딩 만들기 바인딩을 시도하십시오.

+0

답변 해 주셔서 감사합니다. 나는이 줄을 가지고 나왔다 : remove1 (L, L2) : (L2, H, L2)를 추가 (\ + (L == []) -> L = [H | , remove1 (T, L2); []). 그러나 오류가 발생합니다. _G256 오류 : 전체 스택이 없음 왜 그럴까요? – screenshot345

+0

필자는 각 술어가 각 인수 구조에 대해 한 번 선언되는보다 일반적인 프롤로그 구문에 익숙하다는 것을 고백해야합니다. 내가 말할 수 있지만, 스택 오류가 발생하면 재귀가 종료되지 않았다는 의미입니다. 이는 종료 기준이 잘못되었거나 나머지 프로그램이 사용자가 생각하는대로 인수를 축소하지 않기 때문입니다. 이 경우 나는 후자를 의심하고 추가 정보를주의 깊게 살펴 보라고 조언 할 것입니다. 왜냐하면 아마 양쪽에 L2를 원하지 않을 것 같기 때문입니다. – charlieb

관련 문제