문제

닫혔습니다.이 질문은 주제에서 벗어난입니다. 현재 답변을 받지 않습니다. 이 질문을 개선하고 싶으십니까?소프트웨어 엔지니어링 스택 교환에 대해 주제별이 되도록 질문을 업데이트하십시오. 7년 전 문을 닫았습니다.\"2013-08-09 이 질문 개선

다음을 만드는 프로그램을 작성하려고합니다.

?- g([2,3, [22,[3],9] ,4,[5],99],X).

X= [2,3,22,[3],9 ,4,5,99]

따라서 주어진 목록에서 목록을 검색하고 대괄호 []가 없는 요소로 대체합니다.

그래서 저는 이 프로그램을 작성했습니다.

첫 번째 블록은 목록의 첫 번째 요소인 목록을 검색합니다. 그러한 요소가 없으면 [there_is_no_list]를 반환합니다.

first_list_in_the_list([],[there_is_no_list]):-!.  
first_list_in_the_list([H|_],X):-is_list(H),X=H,!.  
first_list_in_the_list([_|T],X):-first_list_in_the_list(T,X).

첫 번째 블록은 프롤로그에서 완벽하게 작동합니다.

두 번째 블록은 목록에서 요소 X를 검색한 다음 목록을 두 개의 목록으로 분할합니다. 하나는 X 이전의 모든 요소 목록이고 두 번째는 X 이후의 요소입니다.

splite_when_find_element([H|T],H,[],T):-!.  
splite_when_find_element([H|T],X,F,G):-
    splite_when_find_element(T,X,F1,G),append([H],F1,F).

Prolog에서도 잘 작동합니다.

세 번째 블록은 추가이고 두 개의 목록을 새 목록으로 결합합니다.

append([],L,L).  
append([H|T],L,[H|U1]):- append(T,L,U1).

마지막 부분은 다음과 같습니다.

gg(L,L):-first_list_in_the_list(L,[there_is_no_list]),!.    
gg(L,U):-first_list_in_the_list(L,X),
         splite_when_find_element(L,X,F,G),gg(G,R),append(F,X,E),
         append(E,R,U).

내가 query [2,[3],5]를 줄 때 나는 또한 [2,[3],5]를 얻고 그것이 왜 이것을 하는지 정말로 이해하지 못합니다.

도움이 되었습니까?

해결책

당신의 논리는 결함이 있습니다.first_list_in_the_list 함수는 빈 목록이나 둘 이상의 요소가 있는 목록을 찾습니다.하나의 요소 목록은 무시됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 softwareengineering.stackexchange
scroll top