2013-11-23 9 views
2

나는 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). 

아무 도움이됩니다. 나는 컷 (!) 연산자가 멤버/비 멤버와 함께 사용되는 예제를 보았습니다.하지만이 방법을 시도 할 것이므로 목록이 정렬된다는 사실을 이용해야합니다. 미리 감사드립니다.

답변

2

전반적으로 해결 방법은 중간에 있습니다 (관찰 한대로). 내 생각에는 고쳐야 할 부분이 두 곳 있습니다. 하나는, 당신이 지적한대로, "기본 경우"입니다. 나는 다음과 같이 그것을 할 것이다 :

intersectS([], _, []). 
intersectS(_, [], []). 

다른 말로하면, 빈 목록과 교차하는 것은 아무것도 없다.

두 번째 문제 지점은 A = C의 절입니다. 당신은이 :

두 목록의 머리가 일치하는 경우, 다음 [A] (매칭 헤드)가 추가 교차로 ( Z)이 두 목록의 꼬리의 교차점이라고 말했다
intersectS([A | B], [C | D], Z) :- A = C, append(Z, [A], Y), intersectS(B, D, Y). 

. 이것은 올바르지 않은 것 같습니다.

intersectS([], _, []). 
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([A], Y, Z), intersectS(B, D, Y). 
:

intersectS([A | B], [C | D], Z) :- A = C, append([A], Y, Z), intersectS(B, D, Y). 

그래서 모든 일처럼 보인다 : 나는 당신이 교차로 (Z)는 다음과 같습니다 [A]에 추가 된 꼬리 BD의 교차점이라고 말하고 싶은 생각

하나의 요소 만 다루고 있기 때문에 더 나아가서 append을 제거 할 수 있습니다. append([A], Y, Z)Z = [A|Y]과 동일합니다. 그래서 당신은 단순히 함께 마지막 절을 대체 할 수

intersectS([A | B], [C | D], [A | Y]) :- A = C, intersectS(B, D, Y). 

는 테스트 케이스 실행 : [] ((D [], Z) 나는 교차와 같은 사실을 추가하는 시도,

?- intersectS([1, 2, 3, 4], [2,4,6], L). 
L = [2, 4] ; 
false. 

?- 
+0

아와 교차, D, Z). 그러나 밑줄 옵션을 완전히 잊었습니다. 그리고 지금 논리에서 내 실수를보고, 정말 고마워! – Jsh

+0

부수적으로이 관계가 여전히 false를 반환하는 이유는 무엇입니까? Z 값의 정확성이 증명 가능하지 않습니까? – Jsh

+0

@Jsh 하나의 해법을 묻는 프롬프트를 띄운 후에';'로 더 많은 것을 요구하면''false '가 반환됩니다. 따라서'잘못된 응답은 발견 된 해결책에는 적용되지 않지만 추가 해결책은 없다는 사실에 적용됩니다. – lurker