【问题标题】:Find adjacent members查找相邻成员
【发布时间】:2014-05-08 02:23:36
【问题描述】:

我必须找出列表的两个成员是否相邻。限制是使用append/3 谓词。到目前为止,我已经完成了以下操作,如果它是真的,它会起作用,否则我没有得到任何答案,就像它永远运行一样。

adjacent(X,Y,L):-
   append(L1,[X,Y],T1),append(T1,T2,L).

【问题讨论】:

    标签: prolog failure-slice


    【解决方案1】:

    要查看您的程序是否会循环,只需考虑以下

    相邻(X,Y,L):- 追加(L1,[X,Y],T1),追加(T1,T2,L)

    如果这个程序会循环,那么原来的程序也会循环。它可能会成功,但它仍然会循环。

    在您的第一个目标中,L1T1 都是未实例化的变量 - 这很容易看出,因为在此片段的其他任何地方都没有使用它们。因此,无论XYL 可能是什么,此程序都会始终 循环。要解决此问题,您必须修改可见部分中的某些内容。

    一种可能性是交换两个目标。但是还有一个更简单的方法:

    adjacent(X,Y,L) :-
       append(_,[X,Y|_],L)
    

    但是请注意,这并不能确保 L 确实是一个格式正确的列表。事实上,adjacent(1,2,[1,2|nonlist]) 成功了。如果它应该是一个列表:

    adjacent(X,Y,L) :-
       append(_,[X,Y|R],L),
       append(R,[],R).
    

    请参阅 了解更多信息。

    【讨论】:

      【解决方案2】:

      这可能不是最佳答案,但您也可以尝试:

      adjacent(X,Y,Zs):- append(As,[X,Y|Ys],Zs).
      

      例如:

      3 ?- adjacent(1,2,[1,2,3]).
      true .
      1 ?- adjacent(1,3,[1,2,3]).
      false.
      

      【讨论】:

      • 这与@false 在他的回答中建议的第一个解决方案相同(他使用_ 作为单例变量)。
      猜你喜欢
      • 1970-01-01
      • 2021-05-17
      • 2015-10-20
      • 2015-01-08
      • 2014-12-17
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多