Prolog:列表中没有元素

时间:2011-05-03 16:41:28

标签: list search prolog

我需要在列表中找到元素位置(作为内置谓词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,!.

4 个答案:

答案 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]),!.