2017-10-13 3 views
3

목록의 A와 B에서 n 번째 요소를 모두 제거하고 싶습니다.이 요소는 서로의 n 번째 요소와 일치하지 않습니다. 예를 들어, A[1,2,3,4,5]을 포함하고 B[1,2,2,4,7]을 포함하는 목록이 있습니다. 결과는 목록 C[3,5]이고 목록이 D이고 목록이 [2,7]이어야합니다. 이 작은 코드 조각을 생각해 냈지만 아직 제대로 작동하지 않습니다. 대신 [3,5][2,7]재귀를 사용하여 목록에 여러 머리글을 추가하는 방법

without_doubles([], [], [_], [_]). 
without_doubles([H|T1], [H|T2], C, D):- 
    without_doubles(T1, T2, C, D). 
without_doubles([H1|T1], [H2|T2], [H1|C], [H2|D]):- 
    without_doubles(T1, T2, C, D). 

, 나는 [3,5,_G2442][2,7,_G2445]을 얻고있다. 나는 아마 쉽게 고칠 수 있다는 것을 알고 있지만, 나는 그것을 알아낼 수 없다. 미리 도와 줘서 고마워!

+1

은'_'s가'without_doubles ([], [], [_], [_])'에 뭐.? –

+0

저는 개인적으로 기본 케이스가 재귀의 목표 상태를 설명해야한다고 생각했습니다. 따라서 A와 B는 비어 있고 C와 D는 임의의 변수 (예 : '_')를 포함합니다. – Boomer

+1

Prolog에는 실제로 "입력"및 "출력"이 없습니다. 반대 방향으로 질의 할 수도 있습니다. 불행하게도 나는 Haskell/Prolog 인터프리터가 많은 마법적인 일을하는 많은 사람들을 본다. 실제로 통역사가 작동하는 방식은 매우 간단합니다 (최적화는 꽤 복잡합니다). 밑줄은 단순히 익명의 변수를 의미합니다. 'without_double ([], [], [A], [B])'라고 쓸 수 있습니다. 게다가. –

답변

4

첫 번째 규칙은 있어야한다 : 당신이 전에했다

without_doubles([], [], [], []). 

두 익명의 변수 _가 문제의 원인이었다.

?- without_doubles([1,2,3,4,5],[1,2,2,4,7],L,R). 
L = [3, 5], 
R = [2, 7] ; 
L = [3, 4, 5], 
R = [2, 4, 7] ; 
L = [2, 3, 5], 
R = [2, 2, 7] ; 
L = [2, 3, 4, 5], 
R = [2, 2, 4, 7] ; 
L = [1, 3, 5], 
R = [1, 2, 7] ; 
L = [1, 3, 4, 5], 
R = [1, 2, 4, 7] ; 
L = [1, 2, 3, 5], 
R = [1, 2, 2, 7] ; 
L = [1, 2, 3, 4, 5], 
R = [1, 2, 2, 4, 7]. 

은 분명히 우리가 첫 번째 결과가 아닌 다른 사람을 원한다 :

그러나 코드와 두 번째 문제가 있습니다. 우리가 다른 것들을 얻는 이유는 이 당신의 마지막 규칙에 H1H2이 달라야한다고 말하고 있기 때문입니다.. 이는 Prolog가 두 번째 규칙을 적용 할 수있을 때 마지막 규칙을 적용하여 모든 선택 지점을 만들 수 있음을 의미합니다.

당신은 dif/2를 사용하여 명시 적으로 H1H2이 마지막 규칙 달라야한다는이 문제를 해결할 수 있습니다

without_doubles([H1|T1], [H2|T2], [H1|C], [H2|D]):- 
    dif(H1, H2), 
    without_doubles(T1, T2, C, D). 

을 이제 우리는이 :

?- without_doubles([1,2,3,4,5],[1,2,2,4,7],L,R). 
L = [3, 5], 
R = [2, 7] ; 
false. 
+0

도움을 주셔서 감사합니다. 지금 작동 중입니다! – Boomer

3

는 두 가지 문제가 있습니다 당신의 코드 :

  1. basecase가 si를 지정합니다. ngleton은 세 번째와 네 번째 인수로 나열하지만 빈 목록이어야합니다.
  2. 아무 것도 두 번째 절에서 백 트랙킹하지 못하게하고 따라서 세 번째 절을 가져옵니다.

다음과 같이이 문제를 해결할 수 있습니다

%% no [_], but [] 
without_doubles([], [], [], []). 
without_doubles([H|T1], [H|T2], C, D):- 
    without_doubles(T1, T2, C, D). 
%% guard the fact that H1 and H2 are different 
without_doubles([H1|T1], [H2|T2], [H1|C], [H2|D]):- 
    dif(H1,H2), 
    without_doubles(T1, T2, C, D).
+0

나를 도와 주셔서 감사합니다! – Boomer