【发布时间】:2016-05-20 21:28:51
【问题描述】:
我正在尝试实现一个谓词,它将整数列表拆分为两个给定另一个谓词作为参数。定义如下:
split(P, L, L1, L2),
在哪里:
P - predicate to split upon
L - list to split
L1 - result list of integers that return true on predicate check
L2 - result list of integers that return false on predicate check
我正在尝试修改此代码,它使用硬编码检查所讨论的整数是否更大/更小或等于 X 来拆分列表(这可行):
split(X, [], [], []).
split(X, [H|T], [H|L1], L2) :- H=<X, split(X, T, L1, L2).
split(X, [H|T], L1, [H|L2]) :- H>X, split(X, T, L1, L2).
出于测试目的,我从 RosettaCode 中复制了一个谓词来检查数字是否为偶数,如下所示:
even(N) :-
(between(0, inf, N); integer(N) ),
0 is N mod 2.
这是我对上面代码的修改,但它在最后两行返回“语法错误:预期运算符”:
split2(P, [], [], []).
split2(P, [H|T], [H|L1], L2) :- P(H), split2(P, T, L1, L2).
split2(P, [H|T], L1, [H|L2]) :- \+ P(H), split2(P, T, L1, L2).
我认为我的错误在于检查谓词是返回真还是假,但找不到合适的方法。
编辑:忘记添加我的电话:
?- split2(even,[2,7,4,8,-1,5],L1,L2)
【问题讨论】: