저는 프롤로그로 시작하고 연습으로 목록을 뒤집어 쓰려고합니다.프롤로그의 목록 반전
예를 들어, 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
기능을 사용할 때 작동한다) 목록을 뒤집은 다음 목록의 머리에 그것을 추가한다. 나 좀 도와 줄 수있어?
귀하의 문제는 당신이 일반적으로 APPEND를 호출하여 진한/3 술어 다 (해결하려고한다는 것입니다 /삼). 꼬리/2 술어에 대해 생각해보십시오. 뭐하는거야? 목록의 첫 번째 요소를 제거하고 빈 꼬리표를 목록 꼬리에 연결하여 목록의 꼬리를 가져옵니다. 그것은 불필요합니다. 변수 Y는 이미 목록의 꼬리를 포함합니다. 따라서, 간단한 사실'tail ([_ X | Y], Y) .'보다는 꼬리 술어가 정말로 필요한 경우 작업을 수행합니다. –
두 번째 마지막 줄에'conc (R_TAIL, X, S)'를 쓰면 코드가 작동하지 않습니다. 여기서 R_TAIL은 목록이고 X는 목록 요소입니다. 그러므로 당신은리스트를 가진 요소를 연결하려고합니다 ('conc (R_TAIL, [X], S)'와 함께). 일어나는 일을 이해하기 위해 항상 간단한 검색어 (예 :'inv ([1,2], X)')의 흔적을 살펴 봅니다. –
@ 조안 C 그래, 그거야 :). 답변 해 주셔서 감사합니다. 나는 정말로 프롤로그와이 문법 문제로 시작하고있다. 나는 그것이 내게 일어날 것으로 생각된다고 생각한다 : p –