2012-11-23 7 views
-1

L이 목록에없는 R의 모든 용어를 포함하는 목록 인 경우에만 성공하는 조건부 f (L, R)을 작성해야합니다. 예를 들어 :프롤로그의 하위 목록에있는 모든 요소의 목록

f(L,[1,2,3,[4,5,6],[[7,8,9]],[]]). 

는 제공해야합니다 :

L = [1,2,3,4,5,6,7,8,9,[]] 

빈 목록이 결과에 존재해서는 안 :

L = [1,2,3,4,5,6,7,8,9] 

내가 대신 다음과 같은 결과를 제공하는 조건을 썼다. 내 술어는 다음과 같습니다.

f([],[]). 
f(V,[H|T]):- H = [_|_] -> append(L,R,V), 
       f(L,H), f(R,T),!; 
       V = [H1|T1], H1=H, f(T1,T). 

나는 두 가지 의문의 여지가 있습니다. 우선 빈 목록이 결과에 나타나서는 안됩니다. 또한 나는 컷 (!)을 넣지 않으면 왜 효과가 없는지 모르겠다. 사실, 내가 컷을 넣지 않으면 위와 같이 결과가 나옵니다.하지만 다른 결과를 요구한다면 그것은 영원히 반복됩니다. 나는 이것이 왜 반복되어야하는지 정말로 이해하지 못한다.

+1

이 참조 호출 질문 http://stackoverflow.com/questions/11220567/flatting-a-list/. 일반적으로 입력은 첫 번째 인수이고 두 번째 출력은 f ([1,2,3, [4,5,6], [[7,8,9]], []], L) ==> L입니다. [1,2,3,4,5,6,7,8,9] – joel76

답변

1

빈 목록을 제거하려면 해당 사례를 처리하십시오 (삭제하십시오).

루프 정보 : 모두 인수가없는 추가 (L, R, V)를 호출 할 수 있습니다. 재귀 호출 후에 append를 이동하십시오.

마지막으로, 어쩌면 당신은 바르게 사용하지 않는 '다음 다른 경우'구조 : 나는 '연속'을 강조 들여 쓰기를 사용하여 일반적인 SWI - 프롤로그 소스 스타일을 사용하여 들여 쓰기 한이

f([], []). 
f(V, [H|T]) :- 
    ( H = []  % if H = [] 
    -> f(V, T)  % then discard 
    ; H = [_|_] % else if H is list 
    -> f(L,H),  % flat head 
     f(R,T),  % ... 
     append(L,R,V) 
    ; V = [H|T1], % else 
     f(T1,T)  % ... 
    ). 
+0

팁 주셔서 감사합니다! 이제 완벽하게 작동합니다. – markusian

관련 문제