2016-09-24 3 views
1

저는 Prolog를 처음 사용하고이 연습 교본을 발견했습니다. 이 질문은 술어 정의를 요청합니다.인터리브 Prolog 목록의 요소

zipper([[List1,List2]], Zippered). //this is two lists within one list. 

이 술어는 List1의 요소를 List2의 요소와 인터리브해야합니다.

zipper ([],[],Z). 
zipper([X],[],[X]). 
zipper([],[Y],[Y]). 
zipper([X|List1],[Y|List2],[X,Y|List]) :- zipper(List1,List2,List). 

내가 한 목록이 솔루션을 번역 할 수있는 방법 확실하지 않다 : 예를 들어

,

zipper([[1,3,5,7], [2,4,6,8]], Zippered) -> Zippered = [1,2,3,4,5,6,7,8]. 

zipper([[1,3,5], [2,4,6,7,8]], Zippered) -> Zippered = [1,2,3,4,5,6,7,8]. 

은 지금까지 나는 두 개의 서로 다른 목록에 대한 해결책을 가지고 있습니다. 내가 어디에서 시작할 수 있는지에 대한 제안은 매우 도움이 될 것입니다!

+1

이것은 매우 쉽게 보인다. zipper ([[List1, List2]], Zippered) : - zipper (List1, List2, Zippered).'[[List1, List2]]'는 확실히 쓰인다. ** 아닙니다 ** 한 쌍의 목록을 나타내는 좋은 방법입니다. 별도의 인수를 사용하거나,'(-)/2' 연산자를 사용하여'List1-List2' 쌍을 나타낼 수 있습니다. – mat

답변

1

먼저 zipper ([],[],Z).zipper ([],[],[]).으로 변경해야합니다. 그런 다음 하나의 목록에 대해 작동하도록하려면 주석에서 권장하는 매트를 수행하거나 약간 변경할 수 있습니다. 그래서 내 버전은 다음과 같습니다

zipper([],[],[]). 
zipper([X,[]],X). 
zipper([[],Y],Y). 
zipper([[X|List1],[Y|List2]],[X,Y|List]) :- zipper([List1,List2],List). 

그리고 당신의 예제

: 당신은 이미 모든 성분이 있기 때문에

?- zipper([[1,3,5,7], [2,4,6,8]], Zippered). 
Zippered = [1, 2, 3, 4, 5, 6, 7, 8] ; 
Zippered = [1, 2, 3, 4, 5, 6, 7, 8] ; 
false. 

?- zipper([[1,3,5],[2,4,6,7,8]],Zippered). 
Zippered = [1, 2, 3, 4, 5, 6, 7, 8] ; 
false.