Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 序言-索引_List_Indexing_Prolog_Element - Fatal编程技术网

List 序言-索引

List 序言-索引,list,indexing,prolog,element,List,Indexing,Prolog,Element,我必须在列表中找到给定元素的所有索引,并将其作为列表返回。例如: ?- indexList(a,[a,b,c,a,b],Rs). Rs = [0,3] 我的想法是: positions( E, L, P ) :- positions( E, L, 0, Rs ). positions( E, [], _, [] ). positions( E, [E|Xs], P, [P|PT] ) :- P1 is P + 1, positions( E, Xs, P1, PT ). positions(

我必须在列表中找到给定元素的所有索引,并将其作为列表返回。例如:

?- indexList(a,[a,b,c,a,b],Rs).
Rs = [0,3]
我的想法是:

positions( E, L, P ) :- positions( E, L, 0, Rs ).
positions( E, [], _, [] ).
positions( E, [E|Xs], P, [P|PT] ) :- P1 is P + 1, positions( E, Xs, P1, PT ).
positions( E, [X|Xs], P, PT ) :-  P1 is P+1, positions( E, Xs, P1, PT ).

当我跟踪这一点时,我会得到一个列表,其中每个位置都在其中(在最后一步之前的步骤中)。但是在最后的步骤中,他不知怎么地改变了它,并返回为true。

您在第一行中犯了一个小错误。您正在调用
位置(E、L、0、Rs)
,但最后一个参数应该是
P
,以便与子句开头具有相同名称的最后一个参数进行绑定。所以第一行应该是这样的:

positions(E, L, P) :- positions(E, L, 0, P).

你在第一行犯了一个小错误。您正在调用
位置(E、L、0、Rs)
,但最后一个参数应该是
P
,以便与子句开头具有相同名称的最后一个参数进行绑定。所以第一行应该是这样的:

positions(E, L, P) :- positions(E, L, 0, P).

您的问题是没有使用
Rs
返回您正在使用
p
的职位列表。 您应该在
位置/3
中看到一个lint警告(单例变量P和Rs),它应该警告您这一点

此外,在
位置/4
的第三条中,您应该检查E是否不同于X:

positions( E, L, Rs ) :- positions( E, L, 0, Rs ).
positions( E, [], _, [] ).
positions( E, [E|Xs], P, [P|PT] ) :- P1 is P + 1, positions( E, Xs, P1, PT ).
positions( E, [X|Xs], P, PT ) :-  E\=X, P1 is P+1, positions( E, Xs, P1, PT ).

您的问题是没有使用
Rs
返回您正在使用
p
的职位列表。 您应该在
位置/3
中看到一个lint警告(单例变量P和Rs),它应该警告您这一点

此外,在
位置/4
的第三条中,您应该检查E是否不同于X:

positions( E, L, Rs ) :- positions( E, L, 0, Rs ).
positions( E, [], _, [] ).
positions( E, [E|Xs], P, [P|PT] ) :- P1 is P + 1, positions( E, Xs, P1, PT ).
positions( E, [X|Xs], P, PT ) :-  E\=X, P1 is P+1, positions( E, Xs, P1, PT ).

gusbro的观察,关于检查E是否不同于X,只有当你要求的不仅仅是第一个解决方案时才需要,这两种情况下都是正确的。试着在有修改和没有修改的情况下运行你的代码,看看会发生什么。gusbro的观察,关于检查E是否不同于X,只有当你要求的不仅仅是第一个解决方案时才需要,这两种情况下都是正确的。试着在有修改和没有修改的情况下运行代码,看看会发生什么。