2012-12-15 7 views
0

여러 항목이 포함 된 프롤로그 목록이 있습니다. 이 목록의 내용을 '정규화'하고 결과를 새 목록에 써야합니다. 하지만 여전히 문제가 있습니다. 다음 코드는 내가 그것을 어떻게 보여줍니다프롤로그 목록에 항목을 추가하는 방법

normalizeLists(SourceList, DestList) :- 

% get all the member of the source list, one by one 
member(Item, SourceList), 

% normalize the item 
normalizeItem(Item, NormItem), 

% add the normalize Item to the Destination List (it was set [] at beginning) 
append(NormItem, DestList, DestList). 

문제는 APPEND 술어입니다. 나는 같은 프롤로그에, 나는 절대적으로 프로그래밍과 같은 일을 할 수 없기 때문에이 추측 :

DestList = DestList + NormItem,

하지만 내가 어떻게 프롤로그에서 그런 일을 할 수 있습니까? 또는 내 접근 방식이 올바르지 않은 경우, 어떻게 이런 종류의 문제를 해결할 수있는 프롤로그 코드를 작성할 수 있습니까?

정말 도움이됩니다.

건배는 프롤로그에서

답변

1

변수는 한 번 통일 구속, 수정할 수 없습니다. 변수는 이고 변수는이거나 확실한 값 (용어는 다른 변수 일 수 있음)입니다. 그러면 NormItem은 빈 목록이 아니기 때문에 append(NormItem, DestList, DestList)이 실패합니다.

또 다른 문제는 그게 NormItem 목록이 아닙니다. 당신이 시도 할 수

normalizeLists([], []). 
normalizeLists([Item|Rest], [NormItem|NormRest]) :- 

% normalize the item 
normalizeItem(Item, NormItem), 

normalizeLists(Rest, NormRest). 

또는 (당신의 프롤로그가 그것을 지원하는 경우) 모두 같은 정의를 건너 뛰고 maplist

... 
maplist(normalizeItem, Items, Normalized), 
... 
+0

안녕 CapelliC처럼 고차 술어를 사용합니다. 그것은 올바르게 작동합니다. 감사. BTW, 그렇습니다. 내 프롤로그는 매플리스트를 지원합니다. 매플리스트에서하는 방법에 대한 정보를 좀 더 공유 할 수 있습니까? 감사합니다 –

+0

나는 (그냥 당신의 제안을 시도하여) 매 플라이 스를 시도하고 놀랍게 작동합니다. 불필요한 코드를 줄입니다. 감사 –

관련 문제