Prolog 获取列表中给定元素的索引

Prolog 获取列表中给定元素的索引,prolog,Prolog,我试图解决一些基本的难题来学习prolog。我试图通过递归获得列表中给定元素的索引。我在试图解决这个问题时遇到了困难,我不知道为什么。当我执行这个命令时,它只返回“false”,而不是索引 elem(_, [], 0). elem(E, [E | T], RES) :- elem(E, T, CUR_RES), RES is CUR_RES + 1. 我使用一个示例查询来检查代码元素(2[1,2],X)。您的问题 elem(2, [1, 2], X). 当它试图与基本情况统一时

我试图解决一些基本的难题来学习prolog。我试图通过递归获得列表中给定元素的索引。我在试图解决这个问题时遇到了困难,我不知道为什么。当我执行这个命令时,它只返回“false”,而不是索引

elem(_, [], 0).

elem(E, [E | T], RES) :-
    elem(E, T, CUR_RES), RES is CUR_RES + 1. 
我使用一个示例查询来检查代码
元素(2[1,2],X)。

您的问题

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.
您需要对在基本情况下而不是递归情况下查找的值进行匹配。一旦您这样做,其余的更改将根据需要进行。

可能有助于