나는 Prolog에 익숙하지 않으며 재귀를 이해하는 데 어려움이있다. SWI의 기본 제공 교차를 사용하지 않고 두 개의 정렬 된 목록의 교차를 찾는 관계를 작성하려고합니다. 나는 무슨 일이 일어나고 있는지를보기 위해 추적을 사용했고, 교차점을 포함하고있는 새로운 목록을 끝내고 반환하기를 원하는 지점까지 예상대로 행동했다. 이것은 내 기본 케이스가 잘못되었다고 생각하게 만든다. 나는베이스 케이스를 형성하는 몇 가지 다른 방법으로 놀았지만 유익하지 못했습니다. 나는 다음 관계를 가진 테스트 케이스로리스트 [1, 2, 3, 4]와 [2, 4, 6]을 사용 해왔다. (맨 위에있는 기본 케이스는 내가 자리 표시 자로 던진 것이다. 전혀 작동하지 않음) :SWI-Prolog의 교차점
intersectS([], [], []).
intersectS([A | B], [C | D], Z) :- A < C, intersectS(B, [C | D], Z).
intersectS([A | B], [C | D], Z) :- A > C, intersectS([A | B], D, Z).
intersectS([A | B], [C | D], Z) :- A = C, append(Z, [A], Y), intersectS(B, D, Y).
아무 도움이됩니다. 나는 컷 (!) 연산자가 멤버/비 멤버와 함께 사용되는 예제를 보았습니다.하지만이 방법을 시도 할 것이므로 목록이 정렬된다는 사실을 이용해야합니다. 미리 감사드립니다.
아와 교차, D, Z). 그러나 밑줄 옵션을 완전히 잊었습니다. 그리고 지금 논리에서 내 실수를보고, 정말 고마워! – Jsh
부수적으로이 관계가 여전히 false를 반환하는 이유는 무엇입니까? Z 값의 정확성이 증명 가능하지 않습니까? – Jsh
@Jsh 하나의 해법을 묻는 프롬프트를 띄운 후에';'로 더 많은 것을 요구하면''false '가 반환됩니다. 따라서'잘못된 응답은 발견 된 해결책에는 적용되지 않지만 추가 해결책은 없다는 사실에 적용됩니다. – lurker