2014-10-22 3 views
1

목록이 다른 목록의 하위 목록인지 여부를 결정하기위한 조건자를 작성했습니다.목록이 프롤로그에서 다른 목록의 하위 목록인지 여부를 확인하십시오.

sublist([], _). 
sublist([X|XS], [X|XSS]) :- sublist(XS, XSS). 
sublist([X|XS], [_|XSS]) :- sublist([X|XS], XSS). 

그러나이 술어는 이와 같은 상황에서만 처리 할 수 ​​있습니다.

1 ?- sublist([1,2,3], [0,1,0,2,0,3,0]). 
true . 

또한 그 순서가 다른 목록과 다른 목록을 처리 할 수 ​​있습니까?

2 ?- sublist([['D','A','G'],['V','E','D']], [['V','E','D'],['D','A','G']]). 
false. 

는 어떤 도움을 이해할 수있을 것이다 ~~

답변

1

난 당신이 부분 집합을 찾고 하위 목록되지 않은 질문에서 같아요. 첫 번째 목록의 각 항목은 다양성을 가질 수 있고 당신은 당신이 쓸 수있는 성공을 받으려면 :

subset([], _). 
subset([X|Tail], Y):- 
    memberchk(X, Y), 
    subset(Tail, Y). 

첫 번째 절은 기본 케이스이며, 두 번째 절 항목이 Y에 있는지 여부를 확인하고 진행 첫 번째 목록의 두 번째 목록과 두 번째 목록의 꼬리가있는 재귀.

첫 번째 목록의 각 항목은 "소비"하는 경우

두 번째 목록에서 항목은, 당신은 작성합니다

이 경우
subset([], _). 
subset([X|Tail], Y):- 
    select(X, Y, Z), 
    subset(Tail, Z). 

는 두 번째 절은 select/3를 사용하므로 일치하는 요소가 제거된다 재귀시 두 번째 목록

관련 문제