我是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] ;
定义谓词有两个规则。第一个规则只是获取列表的第一个元素,并将其作为第二个参数返回,列表的其余部分作为第三个参数返回。第二个规则通过在结果中复制列表的第一个元素(即第三个参数),然后递归地将该方法应用于其余元素来生成列表。
答案 0 :(得分:2)
split([H|T], H, T).
split([H|T], X, [H|Y]) :-
split(T, X, Y).
有两种方法可以从列表中取出一个元素:
请注意谓词可以双向运行;如果定义了第二个和第三个参数,它将产生这两个可以组合形成列表的所有可能方式。
答案 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)).