I’m having an issue with SWI-Prolog’s delete/3 predicate.
The easiest way is just a quick example:
?- delete([(1,1),(1,2),(3,2)], (1,_), List).
List = [(1,2),(3,2)].
I would expect (1,2) to also be deleted, since (1,_) unifies with (1,2). The SWIPL help says:
Delete all members of
List1that simultaneously unify withElemand unify the result withList2.
Why is this and how can I delete everything that unifies with (1,_)?
” Delete all members of List1 that simultaneously unify with Elem and unify the result with List2.”
(1,X) first unifies with (1,1). therefore, X is unified with 1 and cannot be unified with 2 to delete (1,2).
so the problem is not that it does not delete all of the members; it’s that it doesnt unify simultaneously with (1,2) and (1,1)
(try delete([(1,1),(1,2),(1,1),(3,2)],(1,_),List).
btw, according to the swi-prolog manual:
also, delete/3 is deprecated:
So the easiest way is to write your own predicate. Something like:
perhaps?
check exclude/3, include/3, partition/4