Program to find every list of X in Prolog

prolog, prolog-dif, recursion, runtime-error

Solution

In addition to what others wrote, consider using the dif/2 constraint:

occurrences(_, [], []).
occurrences(X, [X|Ls], [X|Rest]) :-
        occurrences(X, Ls, Rest).
occurrences(X, [L|Ls], Rest) :-
        dif(X, L),
        occurrences(X, Ls, Rest).

You can now use the predicate in all directions, for example:

?- occurrences(X, [a,a,b], Os).
X = a,
Os = [a, a] ;
X = b,
Os = [b] ;
Os = [],
dif(X, b),
dif(X, a),
dif(X, a) ;
false.

The last solution means that the list of occurrences is empty if X is different from both `a` and `b`.

Problem

I am starting on learning Prolog. This program tries to get all occurrences of a given element: ``` occurences(_, [], Res):- Res is []. occurences(X, [X|T], Res):- occurences(X,T,TMP), Res is [X,TMP]. occurences(X, [_|T], Res):- occurences(X,T,Res). ``` But here is the error: ``` ?- occurences(a,[a,b,c,a],Res). ERROR: is/2: Arithmetic: `[]/0' is not a function ^ Exception: (11) _G525 is [] ? creep Exception: (10) occurences(a, [], _G524) ? creep Exception: (9) occurences(a, [a], _G524) ? creep Exception: (8) occurences(a, [c, a], _G524) ? creep Exception: (7) occurences(a, [b, c, a], _G524) ? creep Exception: (6) occurences(a, [a, b, c, a], _G400) ? creep ```

Original source

Related problems