我需要在列表中找到元素位置(作为内置谓词nth,但这里第一个元素有索引1)。但是,如果没有,我还需要一个像'元素不存在'的输出。
我尝试的解决方案并不那么优雅,为计数器赋予了很大的价值
但这不是正确的解决方案!!!
我担心这很容易,但我找不到另一种解决方案!!!
任何人都可以帮助我吗?
search(L):-
write('searching for: '),read(E),find(L,E,Pos),
out(L,E,Pos),!.
out(E,Pos):-
Pos < 10000,
write('element '),write(E),write(' is in position n. '),write(Pos),!.
out(E,Pos):-
Pos > 10000,
write('Element '),write(E),write(' is not present!'),!.
find([X|Xs],E,Pos):-
X \= E,
find(Xs,E,Pos1),
Pos is Pos1 + 1.
find([],_,10000).
find([X],X,1).
find([X|_],X,Pos):-
Pos is 1,!.
答案 0 :(得分:2)
你想要的更像是这样:
search(L):-
write('searching for: '),read(E),
finde(E).
finde(E) :-
find(L,E,Pos), % find succeeds
out(L,E,Pos),!. % and prints, cut ensures we don't try next clause
finde(E) :- write('Element '),write(E),write(' is not present!'),!. % called if not found
这样你就不需要一个总是成功的奇怪的find子句。让它失败。
答案 1 :(得分:1)
请记住,您不仅限于从find / 3谓词中返回数字。
你可以改为返回任何其他原子,如下所示:
find([], _, notfound).
find([H|_], H, 1) :- !
find([_|T], H, Pos) :-
find(T, H, Found),
(
integer(Found), !,
Pos is Found+1
);(
Pos = notfound
).
然而,这种风格写起来有点尴尬,尽管你的返回值更具描述性。
修改错误。
答案 2 :(得分:0)
search(L):-
write('searching for: '),
read(E),
find(L,E,Pos),
fail.
search(_).
find(L,E,0) :-
\+(append(_,[E|_],L)),!.
find(L,E,Pos) :-
append(L0,[E|_],L),
length(L0,Len0),
Pos is Len + 1.
find(_,_,-1).
out(E,0) :-
writef('element %t is not present. ',[E]),!.
out(E,-1) :-
writef('element %t is no longer present. ',[E]),!.
out(E,Pos) :-
writef('element %t is in position %t. ',[E,Pos]),!.
答案 3 :(得分:0)
% NewLine was missing.
out(E,0) :-
writef('element %t is not present. \n',[E]),!.
out(E,-1) :-
writef('element %t is no longer present. \n',[E]),!.
out(E,Pos) :-
writef('element %t is in position %t. \n',[E,Pos]),!.