2017-10-21 11 views
1

저는 프롤로그로 시작하고 연습으로 목록을 뒤집어 쓰려고합니다.프롤로그의 목록 반전

예를 들어, inv([1,2,3], S)S = [3,2,1]. 아래는 파트너와 나는 이미 한 일입니다 제공해야합니다 :

conc([], L, L). 
conc([X|L1], L2, [X|L3]) :- conc(L1, L2, L3). 

tail([X|Y], S) :- conc([], Y, S). 

inv([X|Y], S) :- tail([X|Y], TAIL), inv(TAIL, R_TAIL), conc(R_TAIL, X, S). 
inv([], []). 

처음 세 줄은 잘 작동합니다. 그러나 실제로 마지막 두 가지로 진행되는 작업을 이해하지 못하므로 해결 방법을 알려줍니다. 난 단지 을 찾으려고한다. (이것은 단지 tail 기능을 사용할 때 작동한다) 목록을 뒤집은 다음 목록의 머리에 그것을 추가한다. 나 좀 도와 줄 수있어?

+0

귀하의 문제는 당신이 일반적으로 APPEND를 호출하여 진한/3 술어 다 (해결하려고한다는 것입니다 /삼). 꼬리/2 술어에 대해 생각해보십시오. 뭐하는거야? 목록의 첫 번째 요소를 제거하고 빈 꼬리표를 목록 꼬리에 연결하여 목록의 꼬리를 가져옵니다. 그것은 불필요합니다. 변수 Y는 이미 목록의 꼬리를 포함합니다. 따라서, 간단한 사실'tail ([_ X | Y], Y) .'보다는 꼬리 술어가 정말로 필요한 경우 작업을 수행합니다. –

+0

두 번째 마지막 줄에'conc (R_TAIL, X, S)'를 쓰면 코드가 작동하지 않습니다. 여기서 R_TAIL은 목록이고 X는 목록 요소입니다. 그러므로 당신은리스트를 가진 요소를 연결하려고합니다 ('conc (R_TAIL, [X], S)'와 함께). 일어나는 일을 이해하기 위해 항상 간단한 검색어 (예 :'inv ([1,2], X)')의 흔적을 살펴 봅니다. –

+0

@ 조안 C 그래, 그거야 :). 답변 해 주셔서 감사합니다. 나는 정말로 프롤로그와이 문법 문제로 시작하고있다. 나는 그것이 내게 일어날 것으로 생각된다고 생각한다 : p –

답변

1

코드가 작동하지 않습니다.

대신이 방법을 시도해보십시오

?- reverse([1,2,3],Xs), write(Xs). 

reverse(Xs,Ys) :- reverse(Xs,[],Ys). 

reverse([],A,A). 
reverse([H|T],R,A) :- reverse(T,[H|R],A). 
+1

[tag : prolog-toplevel]에서 왜'write/1'을 사용합니까? – repeat

+1

@repeat -'Xs '의 값을 콘솔에 표시하는 것입니다. 계산에 필요하지 않습니다. – Enigmativity

+1

나는 그것을 이해하지 못한다. 최상위 변수는 변수 바인딩을 보여줍니다. 왜'write/1'을 사용해야합니까? – repeat

2

대체 foldl/4 기반 솔루션 :

prepend_element(E, L, [E|L]). 

inv(List, Reversed) :- 
    foldl(prepend_element, List, [], Reversed).