Mar*_*tin 7 split list prolog clpfd
我一直在尝试在Prolog中创建一个谓词,它将整数列表分成正整数列表和负整数列表.
具有预期结果的示例查询:
?- split([1,-2,3,4,-8],X,Y).
X = [1,3,4],
Y = [-2,-8].
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的代码:
split([], [], []).
split([Head|Tail], List1, List2) :- split(Tail, [Head|List1], List2), Head>=0.
split([Head|Tail], List1, List2) :- split(Tail, List1, [Head|List2]), Head<0.
Run Code Online (Sandbox Code Playgroud)
我似乎无法弄清楚我做错了什么.
递归部分不太正确.
split([], [], []).
split([Head|Tail], [Head|List1], List2) :- Head>=0, split(Tail, List1, List2).
split([Head|Tail], List1, [Head|List2]) :- Head<0, split(Tail, List1, List2).
Run Code Online (Sandbox Code Playgroud)
Head如果Head >= 0和否定,应该添加到肯定列表中Head < 0.
此外,检查Head 开头的符号更好,因为它可以防止不必要的递归调用.
在SWI-Prolog中,您可以使用谓词partition/4(通常从apply模块自动加载):
?- partition(=<(0), [1,-2,3,4,-8,0], X, Y).
X = [1, 3, 4, 0],
Y = [-2, -8].
Run Code Online (Sandbox Code Playgroud)