2011-11-25 4 views
3

하위 목록 알고리즘에 대해 다음 구현이 있습니다. 문제점 : 2 개의 목록이 주어지면 하나의 목록이 다른 목록의 하위 목록인지 확인하십시오. 프롤로그에서 또 다른 독특한 솔루션이 필요합니다.프롤로그 챌린지

해결 방법 1 :

sublist([H1|T1], L, [H2|T2]):- 
    H1 = H2, 
    sublist(T1, L, T2). 
sublist([], _, _) 
sublist([H1|T1],L,[H2|T2]):- 
    sublist(L,L,T2). 

해결 방법 2 :

sublist([H|T], [H|L]):- check(T,L), 
sublist(S, [H|T]):- sublist(S,T). 
check([H|T], [H|R]):- 
    check(T,R). 
check([],_). 

해결 방법 3 :

sublist(S,L):- 
    append(_,R,L), 
    append(S,_,R). 

해결 방법 3 '

sublist(S,L):- 
    append3(_,S,_,L). 

... --> [] | [_], ... . 

seq([]) --> []. 
seq([E|Es]) --> [E], seq(Es). 

:와

+0

목록의 다른 목록의 하위 목록이 정확히 무엇을 의미합니까? 왜냐하면 몇 가지 해석이 있기 때문입니다. 나는. (sublist ([a, b, c], [a, c])','sublist ([a, b, c], [c, a])','sublist ([a , b, c], [a, b])'? – salva

+0

오른쪽 예제는 다음과 같습니다.? -sublist ([a b c], [d e b a b c f]) 참 \ n? -sublist ([a b c], [a b f c]) 실패 – Ravul

답변

2
?- phrase((...,seq(Sublist),...),List). 

(경고 :이 솔루션을 설명 할 수 있어야하기 위해서는 먼저 DCGS을 이해할 필요가있다!)

+0

이것은 좋은 해결책입니다. – Ravul

0
sublist([], _). 
sublist([H|T], List) :- 
    select(H, List, R),!, 
    sublist(T, R). 
당신은 경우 더 효율적으로 만들 수

목록은 처음부터 주문 받았다.

방언의 프롤로그에 따라 select/3의 이름이 다를 수 있습니다.

경고 : false의 의견에 따르면, 이것은 "sublist"보다는 오히려 "부분 집합"입니다.

+0

'? - sublist ([a, c], [a, b, c]). '에 대한 해결책은 성공했을 것입니다. – false

+1

흠. 리스트가 세트 또는 적절한리스트를 나타내는데 사용되는지 여부에 달려 있습니다. 나는 보통리스트를 세트로 사용하기 때문에 내 사고에 편향을 줄 수있다. 목록이 시퀀스를 나타내고 하위 목록이 부분 시퀀스 인 경우에는 올바른 것입니다. – twinterer

+0

시퀀스와 세트에 대한 모호성이 있습니다. 그럼에도 불구하고 :'sublist ([a, c], [A, B, c]). '는 적당한 답을 만들어야한다. – false