Prolog Clear List of negative elements without using cuts

后端 未结 3 1757
慢半拍i
慢半拍i 2021-01-16 16:45

How do I write a procedure in Prolog that clears a list of integers of its negative elements and returns the result in a new list? Without using cuts but can use negation.

相关标签:
3条回答
  • 2021-01-16 17:01

    Using recursion for the last case,

    I'd write :

    filter([],[]).
    
    filter([H|T],S) :-
      H<0,
      filter(T,S).
    
    filter([H|T], L) :- 
     H>=0, 
     filter(T, S),
     append([H],S,L).
    
    0 讨论(0)
  • 2021-01-16 17:06

    In SWI-Prolog you can use exclude/3

    ?- exclude(negative, [-1, -0.5, 0, 0.5, 1], L).
    L = [0, 0.5, 1].
    

    provided that you have a definition for negative/1:

    negative(Number) :-
        Number < 0.
    
    0 讨论(0)
  • 2021-01-16 17:07

    You have it almost right. Your solution was:

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

    The base case and the case where the item is negative are right. The problem is with the last case. Once you checked that the item is nonnegative you know that the item will be on the resulting list. Therefore you should do the recursion and return a list that contains the element you have checked (H) and the list returned by recursion. Thus, the last clause should be

    filter([H|T],[H|S]) :-
      H>=0,
      filter(T,S).
    
    0 讨论(0)
提交回复
热议问题