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

问题出在附加谓词中。我想这是因为在 prolog 中,我不能在命令式编程中做类似的事情,例如:

DestList = DestList + NormItem,

但是我怎么能在 Prolog 中做这样的事情呢?或者如果我的方法不正确,我该如何编写 prolog 代码来解决此类问题。

非常感谢任何帮助。

干杯

4

1 回答 1

1

Prolog 中的变量一旦被unification绑定,就不能被修改。也就是说,一个变量要么是自由的,要么具有确定的值(一个术语,可能是另一个变量)。然后append(NormItem, DestList, DestList)将失败,NormItem因为它不是一个空列表。

另一个问题是NormItem它根本不是一个列表。你可以试试

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

 % normalize the item
 normalizeItem(Item, NormItem),

 normalizeLists(Rest, NormRest).

或者(如果你的 Prolog 支持它)完全跳过这样的定义,并使用更高阶的谓词,比如 maplist

...
maplist(normalizeItem, Items, Normalized),
...
于 2012-12-15T06:33:05.260 回答