Ваша проблема с
elem(2, [1, 2], X).
заключается в том, что при попытке объединения с базовым регистром
elem(_, [], 0).
происходит сбой, поскольку второй параметр не пуст.
Когда он пытается объединиться с рекурсивным регистром,
elem(E, [E | T], RES) :-
elem(E, T, CUR_RES),
RES is CUR_RES + 1.
E
равен 2
, что требует, чтобы список был [2|T]
, но так как список равен [1,2]
, он также не может объединить.
Это ближе к тому, что вы хотите
elem(E,[E|_],0).
elem(E,[_|T],Res) :-
elem(E,T,Cur_rest),
Res is Cur_rest + 1.
Пример выполнения:
?- elem(2, [1, 2], X).
X = 1 ;
false.
?- elem(1, [1, 2], X).
X = 0 ;
false.
?- elem(4, [1,2,3,4,5], X).
X = 3 ;
false.
Необходимо выполнить сопоставление для значения, которое вы ищете в базовом случаеа не рекурсивный случай.Как только вы это сделаете, остальные изменения следуют по мере необходимости.