Recursion Prolog递归列表拆分

Recursion Prolog递归列表拆分,recursion,prolog,Recursion,Prolog,我是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

我是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] ;
定义谓词有两条规则。第一条规则只获取列表的第一个元素,并将其作为第二个参数返回,将列表的其余部分作为第三个参数返回。第二条规则通过复制结果中列表的第一个元素(即第三个参数),然后递归地将该方法应用于其余元素来生成列表

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,您需要从库/列表中导出select

:- use_module(library(lists)).
与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,您需要从库/列表中导出select

:- use_module(library(lists)).
有两种方法可以从列表中删除元素:

  • 取头部(第一个元素)
  • 将头部放在一边,从尾部取出一个元素(列表的其余部分)
  • 注意,谓词可以双向运行;如果定义了第二个和第三个参数,它将产生所有可能的方法,将这两个参数组合成一个列表

    有两种方法可以从列表中删除元素:

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

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

    a.k.a.
    select/3
    ,参数顺序不同。参见您想要什么,
    split([1,2,3,2,3,4],2,Y)。
    要做什么?也可以使用不同的参数顺序选择/3。cf.你想要什么,
    split([1,2,3,2,3,4],2,Y)。
    怎么做?