2009-10-30 7 views
0

목록에있는 요소 목록이 [1,2,+]이고 하나의 요소로 스택에 푸시하고자합니다. 나는 그것들을 대괄호들 사이에 넣음으로써 그것을 할 수있다. 그러나 이것은 괄호를 출력물에 나타낼 것이다. 예를 들어, I는 스택에리스트 [1,2 +]의 요소를 푸시 할 :괄호없이 하나의 요소로 스택을 푸십시오.

stack([1,2,+],S,Y). 

stack이고 :

stack(T,S,[T|S]). 

문제는이 I 개 식을 밀면 스택에 중첩 된 대괄호가 있습니다. 예를 들어 [[+,1,2],[*,3,4]]을 얻지 만 [+,1,2,*,3,4]을 원합니다. 이것을 어떻게 할 수 있습니까?

답변

2

당신은 목록 '평평하게'할 수

: 여기

| ?- List = [[+,1,2],[*,3,4]], flatten(List, FlatList). 

List = [[+,1,2],[*,3,4]] 
FlatList = [+,1,2,*,3,4] 
이 가 가

프롤로그 통역은 종종 편평한 술어를해야합니다 목록의 라이브러리를 포함,하지만은 (SWI - 프롤로그의 목록 라이브러리에서) 하나의 구현입니다

flatten(List, FlatList) :- 
flatten(List, [], FlatList0), !, 
FlatList = FlatList0. 

flatten(Var, Tl, [Var|Tl]) :- 
    var(Var), !. 
flatten([], Tl, Tl) :- !. 
flatten([Hd|Tl], Tail, List) :- !, 
    flatten(Hd, FlatHeadTail, List), 
    flatten(Tl, Tail, FlatHeadTail). 
flatten(NonList, Tl, [NonList|Tl]). 
2

귀하의 질문을 완전히 이해하지 못하며 전체 목표는 무엇입니까? 하지만이 같은 것을 원할 수도 있습니다.

stack(el(X, Y, Z), StackTail, [X, Y, Z | StackTail]). 

스택 요소가 모두 세 개이면 3 개의 요소 목록으로 나타내지 마십시오. 이것은 공간 효율적이지 않습니다. 오히려, 용어를 el/3으로 표시하십시오.

또한 스택이 복잡한 용어 목록 인 이 아니라 원자 용어 목록 인 것으로 알고 있습니다. 위의 정의 stack/3은 푸시 할 때 el/3이라는 용어를 풀어 낼 수 있으며 터지는 순간 빌드됩니다.

1

스택에 규칙을 두 개 더 추가하면 트릭을 수행해야합니다.

숙제와 많이 닮았 기 때문에 목록을 제공하지 않지만 첫 번째 인수가 명시 적으로 목록 인 항목이 재귀 적으로 기존 스택에 추가되는 새로운 규칙이 필요합니다.

member/2append/2으로 작성한 경우 문제가 없습니다.

관련 문제