2016-09-23 3 views
2

저는 프롤로그를 처음 접했고 필자에게 도움이 필요한이 연습 과제를 발견했습니다.프롤로그에서 두리스트의 인접 시퀀스 제거

질문은 목록 B를 주장하는 술어 removeContig (A, B)를 정의하기 위해 동일한 항목의 인접한 연속열의 인스턴스가 하나의 인스턴스로 축소된다는 점을 제외하고 목록 A와 동일합니다.

예 :

removeContig ([a,a,b,b,b,c,c,c], [a,b,c]) -> true. 
removeContig ([a,a,b,b,b,c,c,c], [a,b,c]) -> true. 
removeContig ([a,a,b,b,b,c,c,c], [a,b,b,c]) -> false. 
removeContig ([a,b,c,a,b,c], [a,b,c]) -> false. 
removeContig ([a,b,c,a,b,c], [a,b,c,a,b,c]) -> true. 
removeContig([[a],[b,b],[b,b],[a,a],[a,a],[b]], [[a],[b,b],[a,a],[b]]) -> true. 

내가 크게 도움이 될 것입니다이 문제를 접근 할 수있는 방법에 대한 도움이됩니다.

답변

1

무엇

removeContig([], []). 

removeContig([A], [A]). 

removeContig([Hi , Hi | Ti], Lo) :- 
    removeContig([Hi | Ti], Lo). 

removeContig([H1 , H2 | Ti], [H1 | To]) :- 
    H1 \= H2, 
    removeContig([H2 | Ti], To). 

어떻습니까?

트릭은 다음 요소가 다른 경우에만 입력 목록의 머리글을 출력 목록의 머리글로 복사합니다.

입력 목록이 비어있는 경우 빈 목록 절 (removeContig([], []).)이 필요하다는 것을 유의하십시오. OP에 의해 질문으로

--- 편집 ---

, 나는 대답을 개선하려고합니다.

나는 removeContig에 대해 4 개의 조항을 작성했습니다. 처음 두 가지는 터미널 경우이며 설명이 필요 없기를 바랍니다.

removeContig([], []). 

removeContig([A], [A]). 

나는 첫 번째는 당신이 빈 입력 목록 removeContig 호출하는 경우에만 필요하다는 사실에만 관심을 가리 킵니다.

다음 ... 우리가해야 할 일은 무엇입니까?

알고리즘은 입력 목록의 첫 번째 요소를 출력 목록 의 첫 번째 요소로 복사하는 경우와 입력 목록의 두 번째 요소가 다른 경우에만입니다. ,

1) 제 1 및 입력리스트의 두 번째 요소는 동일하다 :

그래서, 단말기 케이스 제외 (입력리스트에서 하나 개의 요소를 출력한다리스트에 복사), 우리는 두 개의 케이스를 가지고 그래서 (복사하지 않음) 삭제 첫번째

2) 제 1 및 입력리스트의 두 번째 요소는 다르므로 출력리스트

케이스 최초로 주먹을 복사 (1) 다음 절로 관리합니다.

removeContig([Hi , Hi | Ti], Lo) :- 
    removeContig([Hi | Ti], Lo). 

여기서 [Hi, Hi | Ti]은 첫 번째 두 요소가 같다고 말합니다. 이 경우 입력 목록의 첫 번째 요소는 무시되며이 경우 무시됩니다. 동일한 인수를 사용하는 removeContig이라고합니다.

케이스 (2)는 다음 절에서 관리된다

removeContig([H1 , H2 | Ti], [H1 | To]) :- 
    H1 \= H2, 
    removeContig([H2 | Ti], To). 

여기서 [H1, H2 | Ti]H1 \= H2 입력리스트의 처음 두 요소가 다른 있음을 보장; 이 경우 입력 목록의 첫 번째 요소 (H1)를 출력 목록의 첫 번째 요소로 복사해야합니다. 이는 [H1 | To]으로 얻어지며, ToremoveContig/2 호로부터 구합니다.

+0

HelloContent ([Hi, Hi | Ti], Lo)의 목적은 무엇입니까? - removeContig ([Hi | Ti], Lo). removecontig ([H1, H2 | Ti], [H1 | To]) : - H1 \ = H2, removeContig ([H2 | Ti], To). 해결책을 이해하고 싶습니다. 의견을 보내주십시오. 감사. –

+0

@SyedRahman - 글쎄 ... 나는 매트가 아니라 max66이다. StackOverflow의 Mat는 Prolog 전문가로서 나보다 훨씬 낫다. 어쨌든 ... 나에게 약간의 미성년자를 줘서 나는 나의 대답을 확장하려고 노력한다. – max66

2

이것은 명령 줄 도구 uniq과 완전히 동일한 기능입니다. SWI-Prolog에서 적어도 group_pairs_by_key/2과 함께 사용할 수 있습니다. 그것은 당신이 필요로하는 것보다 더 많은 작업을 수행하지만,이처럼 사용할 수 있습니다 :

uniq(L, U) :- 
     pairs_keys_values(Ps, L, L), 
     group_pairs_by_key(Ps, G), 
     pairs_keys(G, U). 

당신은 implementation에서 물론 모양의, 시작 지점으로 사용하고, 자신을 작성할 수있다 (매우 솔직해야한다, 당신은 단지 몇 가지를 제거해야합니다).

첫 번째 인수 (반복 기호가있는 목록)가지면에만 작동합니다.

관련 문제