我在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代码来解决这类问题。
非常感谢任何帮助。
干杯
答案 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),
...