【问题标题】:Splitting a list without creating an empty list in Prolog在 Prolog 中拆分列表而不创建空列表
【发布时间】:2019-03-17 04:23:50
【问题描述】:
split(L,X,Y):-append(X,Y,L).

如下创建 4 个拆分:

X = [],
Y = [1, 2, 3] ;

X = [1],
Y = [2, 3] ;

X = [1, 2],
Y = [3] ;

X = [1, 2, 3],
Y = [] ;

我想消除拆分过程中创建的空列表,只保留没有空列表的组合

X = [1],
Y = [2, 3] ;

X = [1, 2],
Y = [3] ;

【问题讨论】:

  • 你试过什么?作为split 谓词中的条件,包括您希望XY 至少有一个带有头部和尾部的元素。如果您不确定如何执行此操作,请查看 Prolog 列表符号。
  • 请您指定如何在拆分谓词中包含条件。
  • 你可以写:split(L, [X|Xs], [Y|Ys]) :- append([X|Xs], [Y|Ys], L).

标签: list split prolog append


【解决方案1】:

为了解决您的问题,如 cmets 中所述,您必须添加一个条件来检查 XY 是否为空,方式如下:

split(L,X,Y):- 
    append(X,Y,L),
    x\=[], 
    Y\=[].

为什么检查是在append/3 之后进行的? X = [] 为真,因为 X 在尚未实例化时可以与 [] 统一。当您调用split/3 时,最初XY 未实例化(如果您使用跟踪器,您可以看到类似_4604\=[] 的内容):X = [] 成功,因此否定失败并且程序返回false 如果你把X\=[]Y\=[]放在append/3之前。

为了更好的理解,我建议你阅读this的文章。

【讨论】:

    【解决方案2】:

    您可以先指定XY 的模式,方法是用“cons”统一它们:

    split(L, X, Y) :-
        X = [_|_],
        Y = [_|_],
        append(X, Y, L).

    使用这种方法的优点是您可能会保护一些循环,因为append/3 不会提出某些空列表的解决方案,然后必须将其过滤掉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多