如何在prolog中添加项目到列表

时间:2012-12-15 05:33:37

标签: list prolog

我在prolog中有一个包含几个项目的列表。我需要“规范化”此列表的内容并将结果写入新列表。但我仍然有问题。 以下代码显示了我是如何做到的:

 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代码来解决这类问题。

非常感谢任何帮助。

干杯

1 个答案:

答案 0 :(得分:1)

一旦受到统一的约束,就无法修改Prolog中的变量。这是一个变量是 free 或具有一定值(一个术语,可能是另一个变量)。然后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),
...