0
votes

I have a list in prolog that contains several items. I need to 'normalized' the content of this list and write the result to a new list. But I still have problem in doing it. The following code shows how I did it:

 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).

The problem is in the append predicate. I guess it is because in prolog, I cannot do something like in imperative programming, such as:

DestList = DestList + NormItem,

But how can I do something like that in Prolog? Or if my approach is incorrect, how can I write prolog code to solve this kind of problem.

Any help is really appreciated.

Cheers

1

1 Answers

1
votes

Variables in Prolog cannot be modified, once bound by unification. That is a variable is either free or has a definite value (a term, could be another variable). Then append(NormItem, DestList, DestList) will fail for any NormItem that it's not an empty list.

Another problem it's that NormItem it's not a list at all. You can try

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

 % normalize the item
 normalizeItem(Item, NormItem),

 normalizeLists(Rest, NormRest).

or (if your Prolog support it) skip altogether such definition, and use an higher order predicate, like maplist

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