【发布时间】:2014-10-14 00:21:40
【问题描述】:
我必须编写一个深度版本的谓词,为列表中的每个数字元素添加一个数字,我已经完成了非深度版本:
addnum(N,T,Y)
这给出了类似的东西:
e.g. ?-addnum(7,[n,3,1,g,2],X).
X=[n,10,8,g,9]
但我现在想创建一个深度版本的 addnum 应该这样做:
e.g. ?-addnumdeep(7,[n,[[3]],q,4,c(5),66],C).
X=[n,[[10]],q,11,c(5),73]
谁能给我一些建议?我从这个开始:
islist([]).
islist([A|B]) :- islist(B).
addnumdeep(C,[],[]).
addnumdeep(C,[Y|Z],[G|M]):-islist(Z),addnum(C,Y,[G,M]),addnumdeep(C,Z,M).
但我不认为我的逻辑是正确的。我在考虑检查尾部是否是一个列表,然后在头部运行 addnum,然后在尾部的其余部分运行 addnumdeep,这是一个列表?
【问题讨论】:
-
可能会内置一个
is_list,具体取决于您的平台。看看可能出现的情况,现在有三个处于最深的回避级别,所以你可能需要一个新的add谓词(我指的是你之前的问题)。 -
如果你有
[Y|Z],你不需要检查Z是否是一个列表,因为它一定已经是因为[Y|Z]是一个带有尾部列表Z的列表。您需要检查Y是否是一个列表,因为它可能是也可能不是。如果是,则[Y|Z]是一个列表,其中包含列表Y作为其第一个元素。 -
@lurker 实际上,顺便说一句,符号
[Head|Tail]并不一定意味着Tail是一个列表。例如,[Y|Z] = [a|b]为真(使用绑定Y = a, Z = b)。 -
检查Y是否是一个列表,如果是,调用
addnumdeep,如果不是,调用add_if_number。 -
@PauloMoura 是的,感谢您指出这一点。我以前在 Prolog 中玩过非列表尾巴。我的评论有点草率,因为当我写评论时,我的脑海里有这个。在这种情况下,我认为可以安全地假设它打算/预期是一个列表尾部。即便如此,这里是否有必要明确检查尾部确实是一个列表,这一点尚不清楚。