【问题标题】:Prolog recursive list splitProlog递归列表拆分
【发布时间】:2016-01-18 04:22:08
【问题描述】:

我是 Prolog 的新手,我在编程作业的第一部分遇到了问题: 创建一个将三个参数作为输入的谓词拆分。第一个和第三个参数是列表,第二个参数是一个元素。您可以将第一个参数视为输入,将最后两个参数视为输出。该方法计算将列表拆分为元素和列表其余部分的所有可能方式。这是一个运行示例。

?- split([1,2,3,4,5],X,Y).
X = 1,
Y = [2, 3, 4, 5] ;
X = 2,
Y = [1, 3, 4, 5] ;
X = 3,
Y = [1, 2, 4, 5] ;
X = 4,
Y = [1, 2, 3, 5] ;
X = 5,
Y = [1, 2, 3, 4] ;

定义谓词有两条规则。第一条规则简单地获取列表的第一个元素并将其作为第二个参数返回,并将列表的其余部分作为第三个参数返回。第二条规则通过复制结果中列表的第一个元素(即第三个参数)来生成列表,然后将该方法递归地应用于其余元素。

【问题讨论】:

标签: recursion prolog


【解决方案1】:
split([H|T], H, T).

split([H|T], X, [H|Y]) :-
    split(T, X, Y).

有两种方法可以从列表中取出一个元素:

  1. 取头部(第一个元素)
  2. 将头部放在一边,从尾部取出一个元素(列表的其余部分)

注意谓词可以双向运行;如果定义了第二个和第三个参数,它将产生所有可能的方式这两个可以组合以形成一个列表。

【讨论】:

    【解决方案2】:
    split(List,Elem,Rest) :- select(Elem,List,Rest).
    
    | ?- select(X,[1,2,3],Y).
    X = 1,
    Y = [2,3] ? ;
    X = 2,
    Y = [1,3] ? ;
    X = 3,
    Y = [1,2] ? ;
    no
    

    并使用 split/3 ;

    | ?- split([1,2,3,4],X,Y).
    X = 1,
    Y = [2,3,4] ? ;
    X = 2,
    Y = [1,3,4] ? ;
    X = 3,
    Y = [1,2,4] ? ;
    X = 4,
    Y = [1,2,3] ? ;
    no
    

    使用 Sicstus-prolog 你需要从库/列表中导出选择

    :- use_module(library(lists)).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      相关资源
      最近更新 更多