【问题标题】:Prolog - IndexofElementProlog - 元素索引
【发布时间】:2012-07-10 03:52:02
【问题描述】:

我必须在列表中找到给定元素的所有索引并将其作为列表返回。比如:

?- indexList(a,[a,b,c,a,b],Rs).
Rs = [0,3]

我的想法是:

positions( E, L, P ) :- positions( E, L, 0, Rs ).
positions( E, [], _, [] ).
positions( E, [E|Xs], P, [P|PT] ) :- P1 is P + 1, positions( E, Xs, P1, PT ).
positions( E, [X|Xs], P, PT ) :-  P1 is P+1, positions( E, Xs, P1, PT ).

当我跟踪这个时,我得到一个列表,其中每个位置都在其中(在最后一步之前的步骤中)。但在最后的步骤中,他以某种方式对其进行了更改并返回了 true。

【问题讨论】:

    标签: list indexing prolog element


    【解决方案1】:

    您的问题是,不是使用Rs 来返回您使用P 的职位列表。 您应该已经在 positions/3 中看到了一个 lint 警告(单例变量 P 和 Rs),它应该警告过您这一点。

    另外,在positions/4 的第三个子句中,您应该检查 E 是否不同于 X:

    positions( E, L, Rs ) :- positions( E, L, 0, Rs ).
    positions( E, [], _, [] ).
    positions( E, [E|Xs], P, [P|PT] ) :- P1 is P + 1, positions( E, Xs, P1, PT ).
    positions( E, [X|Xs], P, PT ) :-  E\=X, P1 is P+1, positions( E, Xs, P1, PT ).
    

    【讨论】:

      【解决方案2】:

      你在第一行犯了一个小错误。您正在调用positions(E, L, 0, Rs),但最后一个参数应该是P,以便与子句开头的最后一个同名参数进行绑定。所以第一行应该是这样的:

      positions(E, L, P) :- positions(E, L, 0, P).
      

      【讨论】:

      • gusbro 的观察,关于检查 E 是否不同于 X,仅当您要求的不仅仅是第一个解决方案时才需要,这在任何一种情况下都是正确的。尝试在修改和不修改的情况下运行您的代码,看看会发生什么。
      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      相关资源
      最近更新 更多