프롤로그에서 요소가 목록의 구성원인지 확인하고 목록의 위치를 쓰는 규칙이 있지만 elemebt를 찾고있는 경우에만 작동합니다 1 위입니다. 도움을 청해야합니다!프롤로그 요소는 목록 구성원 검사입니다.
write_element(X,[X|_],1).
write_element(X,[_|Tail],N):-
N1 is N-1,
write_element(X,Tail,N1).
프롤로그에서 요소가 목록의 구성원인지 확인하고 목록의 위치를 쓰는 규칙이 있지만 elemebt를 찾고있는 경우에만 작동합니다 1 위입니다. 도움을 청해야합니다!프롤로그 요소는 목록 구성원 검사입니다.
write_element(X,[X|_],1).
write_element(X,[_|Tail],N):-
N1 is N-1,
write_element(X,Tail,N1).
정확하게 이걸 어떻게 호출해야합니까? N이 나에 의해 인스턴스화되어야하거나, N1 is N-1
이 작동하지 않는 것처럼 보입니다. 그러나 마찬가지로, N은 기본 경우에 1과 통합되어야하므로 X가 목록에 있으면 N은 1과 같아야합니다. 그래서 저는 이것이 어떻게 불려지는지에 대한 기본적인 혼란이 있다고 생각합니다. 카운터를 N으로 사용하려면 아마 변수로 사용할 수도 없습니다. 감소시키려는 생각을 다시해야합니다. 공유하지 않은 코드의 다른 부분에 length/2
이 없으면 감소시킬 수있는 큰 값으로 호출해야 할 이유가 없습니다.
두 번째 문제는 실제 상황을 포함하지 않았기 때문에 실제로 문제의 문장을 포함시키지 않았기 때문에 실제로 원하는 것은 아마도 위치를 반환한다는 것입니다. nth1/3
.
write_element(X, L, N) :- nth1(N, L, X), write(N).
확율이 의도되는 것이 아니다 좋은 : 요소가있는 경우 당신은 단지 위치를 인쇄 할 경우 우리는이를 구현하기 위해 nth1/3
를 사용할 수 있습니다. nth1/3
과 같은 것을 구현하고 싶다면 조금 더 재미있을 것입니다. 우리가 사용하고있는 카운터에서 돌아 오는 카운터를 별도로 유지해야하기 때문입니다. 그래서 이런 식으로 뭔가를 찾고 바람됩니다
write_element(X,L,N) :- write_element_loop(X,L,1,N).
write_element_loop(X, [X|_] , N, N).
write_element_loop(X, [_|Xs], N0, N) :-
N1 is N0+1,
write_element_loop(X, Xs, N1, N).
이 실제로 코드에 정말 가까이, 난 그냥 카운터 및 명시 적 반환 값의 차이를했습니다. 당신은 단지 그들을 통일 대신 값을 인쇄하려면, 당신은 첫 번째 규칙의 끝에 그것을 추가 할 수 있습니다 :이 도움이
write_element_loop(X,[X|_],N,N) :- write(N), nl.
희망을!
당신이 다른 경우에 작동하도록 코드에 여기에 간단한 보정이 가능, 그것은 첫 번째 위치에 대해서만 작동하고보고 이후 :
write_element(X,[X|_],1).
write_element(X,[_|Tail],N):-
write_element(X,Tail,N1),
N is N1 + 1.
하지만 다니엘의 대답 (+1)은 무엇입니까 너는 공부해야 해.
나는 모호한 질문에서 의도를 회복 할 수있는 방법에 항상 깊은 인상을받습니다. +1 –