Prolog递归列表拆分

时间:2016-01-18 04:22:08

标签: 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, 3, 5] ;
X = 5,
Y = [1, 2, 3, 4] ;

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

2 个答案:

答案 0 :(得分:2)

split([H|T], H, T).

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

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

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

答案 1 :(得分:1)

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)).