2017-05-10 4 views
0

여기 몇 가지 질문은이 기사와 비슷하지만 경험이 없으며 솔루션을 사용하는 방법을 모르겠다. 내 문제 :/Prolog - 목록 및 하위 목록 중 하나의 요소를 사용한 작업

나는이 목록과 같은 목록을 가지고 있습니다 : [[5], [4,7], [1,2,7], [2,6,7], [2 , 4,6,7], [2,4,7], [9,8], [3], [1]

예를 들어 인덱스 3을 알아야합니다. 내가 알고 있어야하는 번호는 목록의 목록에만 한 번 나타납니다. 이는 이전의 함수 호출 조건입니다. 필자가 필요로하는 인덱스는 숫자 3의 경우 인덱스 9 (1에서 시작)입니다. 나는이 초안을 가지고 있었다 :

given_elem_finds_pos(ListOfLists, Element, Pos):- 
    nth1(Pos, ListOfLists, [Element|_]). 

그러나 요소가 하위 목록의 머리 인 경우에만 Pos를 반환합니다. 나는 어떻게 색인을 얻는 지 알 필요가있다.

8. 그럼이 한 짓 번호 :

given_elem_finds_pos([[H|T]| R], Element, Ind):- 
member(Element, [H|T]), 
Ind1 is Ind + 1, 
given_elem_finds_pos(R, Element, Ind1). 

그러나 다시는 성공하지 .. 아무도 도와 드릴까요? 정말 고맙습니다!

답변

0

두 번째 방법은 올바른 방향으로 가고 있습니다. 단지 당신이 묘사하고 싶은 것을 생각하십시오 : 만약 Element[H|T]의 요소라면 당신은 멈추고 싶습니다. 그러므로 여기에 재귀 호출을 할 필요가 없습니다. 또한 현재 인덱스를 반환하려는 경우 추가 인수가 필요합니다 (카운터 및 최종 인덱스의 인수). 재귀 절은 Element이 목록의 요소가 아닌 경우에 필요합니다. 여기가 요소를 인 경우에 대한 조항은

given_elem_finds_pos([List| R], Element, Solution,Solution):- 
     member(Element, List). 

당신이 당신의 확장 된 술어 호출하는 추가 술어 필요한 추가 인수를 추가 할 필요가로 : 이제 당신은 단지에있는

given_elem_finds_pos(ListOfLists, Element, Ind):- 
     given_elem_finds_pos(ListOfLists, Element,0, Solution). 

given_elem_finds_pos/4에 대해 하나 이상의 절을 쓰십시오. "it is not element"의 경우 재귀 적 절이 하나 있습니다. 이 절을 쓰는 데 어려움이 있으면 질문하십시오.

+0

빠른 응답을 보내 주셔서 감사합니다. 나는 다른 절을 만들고 여러분이 무엇을했는지 알아 내려고 노력하고 있습니다. 그래서 다 끝났다고 말할 수는 없지만, 뭔가 말 해주세요. 마지막 반복에서 또는 given_elem_finds_pos/4가 호출 된 마지막 시간에 Prolog가 끝납니다. 인덱스가 하나씩 늘려갔습니다. 아니면 네가하지 않는거야? 왜냐하면 그렇게한다면 솔루션과 동일한 최종 가치가 아닌가? –

+0

예, 맞습니다. 카운터가 증가하고 검색된 하위 목록이 발견되면 카운터는 색인과 같습니다. 그래서 추가 인수가 필요한 이유입니다. 'given_elem_finds_pos ([List | R], Element, Solution, Solution) :'로 시작하는 코드의 stop 절은 현재 카운터로 솔루션 색인을 인스턴스화합니다. –

+0

나는 그것을했고 그것이 작동, 고마워요 !! –