Prolog清除不使用剪切的负元素列表

Prolog清除不使用剪切的负元素列表,prolog,Prolog,如何在Prolog中编写一个过程,清除其负元素的整数列表并在新列表中返回结果?不使用切割,但可以使用否定 例如: ?- filter([1,0,-6,7,-1],L). L = [1,0,7]; no 你说得差不多对。 您的解决方案是: filter([],[]). filter([H|T],S) :- H<0, filter(T,S). filter([H|T],S) :- H>=0, filter(T,[H|S]). 你说得差不多对。 您的解决方案是: fil

如何在Prolog中编写一个过程,清除其负元素的整数列表并在新列表中返回结果?不使用切割,但可以使用否定

例如:

?- filter([1,0,-6,7,-1],L).
L = [1,0,7];
no
你说得差不多对。 您的解决方案是:

filter([],[]).
filter([H|T],S) :-
  H<0,
  filter(T,S).
filter([H|T],S) :-
  H>=0,
  filter(T,[H|S]).
你说得差不多对。 您的解决方案是:

filter([],[]).
filter([H|T],S) :-
  H<0,
  filter(T,S).
filter([H|T],S) :-
  H>=0,
  filter(T,[H|S]).

在SWI Prolog中,您可以使用
exclude/3

?- exclude(negative, [-1, -0.5, 0, 0.5, 1], L).
L = [0, 0.5, 1].
如果您对
负/1
有定义:

negative(Number) :-
    Number < 0.
负数(数字):-
数字<0。

在SWI Prolog中,您可以使用
排除/3

?- exclude(negative, [-1, -0.5, 0, 0.5, 1], L).
L = [0, 0.5, 1].
如果您对
负/1
有定义:

negative(Number) :-
    Number < 0.
负数(数字):-
数字<0。

对最后一种情况使用递归

我会写:

filter([],[]).

filter([H|T],S) :-
  H<0,
  filter(T,S).

filter([H|T], L) :- 
 H>=0, 
 filter(T, S),
 append([H],S,L).
过滤器([],[])。
过滤器([H | T],S):-
H=0,
过滤器(T,S),
追加([H],S,L)。

对最后一种情况使用递归

我会写:

filter([],[]).

filter([H|T],S) :-
  H<0,
  filter(T,S).

filter([H|T], L) :- 
 H>=0, 
 filter(T, S),
 append([H],S,L).
过滤器([],[])。
过滤器([H | T],S):-
H=0,
过滤器(T,S),
追加([H],S,L)。

过滤器([],[])。过滤器([H | T],S):-H=0,过滤器(T,[H | S])。过滤器([],[])。filter([H | T],S):-H=0,filter(T[H | S])。我在尝试执行代码时出错,请参阅:@Src。请不要误解从这个答案中带回家的实际代码@Src。gusbro不支持上述对
过滤器/2
(包括3条条款)的定义。。。事实上,他建议用
filter([H | T],[H | S]):-H>=0,filter(T,S)替换最后一个子句。
@repeat你看到我的问题了吗?@Src。对它包含
findNegative([H1 | T1],S):-findNegative(T1[H1 | S])。
这是胡说八道。我在尝试执行代码时出错,请参阅:@Src。请不要误解从这个答案中带回家的实际代码@Src。gusbro不支持上述对
过滤器/2
(包括3条条款)的定义。。。事实上,他建议用
filter([H | T],[H | S]):-H>=0,filter(T,S)替换最后一个子句。
@repeat你看到我的问题了吗?@Src。对它包含
findNegative([H1 | T1],S):-findNegative(T1[H1 | S])。
这是胡说八道。