Пролог: Элемент отсутствует в списке - PullRequest
2 голосов
/ 03 мая 2011

Мне нужно найти позицию элемента в списке (как встроенный предикат nth, но здесь первый элемент имеет индекс 1). Но мне также нужен вывод типа «Элемент отсутствует», если нет. Я пытаюсь найти решение, не столь элегантное, присваивая большое значение counter.
Но это не правильное решение !!!
Боюсь, это очень легко, но я не могу найти другое решение !!!

Может кто-нибудь мне поможет?

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 ]

2 голосов
/ 03 мая 2011

То, что вы хотите, это что-то вроде этого:

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

Таким образом, вам не нужно странное предложение поиска, которое всегда успешно выполняется с большим числом. Просто дайте ему потерпеть неудачу.

1 голос
/ 04 мая 2011

Помните, что вы не ограничены возвратом чисел из предиката find / 3.

Вместо этого вы можете вернуть любой другой атом, например так:

find([], _, notfound).
find([H|_], H, 1) :- !
find([_|T], H, Pos) :-
        find(T, H, Found),
        (
            integer(Found), !,
            Pos is Found+1
        );(
            Pos = notfound
        ).

Однако этот стильписать немного сложнее, хотя возвращаемое значение гораздо более наглядно.

Отредактировано для исправления ошибки.

0 голосов
/ 04 мая 2011

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

0 голосов
/ 04 мая 2011


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...