Recursion Prolog递归列表拆分
我是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
?- 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)。
怎么做?