Неправильное определение первого элемента списка - Prolog

Узнай цену своей работы

Формулировка задачи:

Добрый день! Есть задачка.Почти правильная!

Условие:

Реализовать процедуру для определения первого элемента списка (в учет принимаются списки всех уровней). Пример: в списке [[[s,a],b],c,[e,[f,[[g,e,p],v],y]],x] первый элемент s.

Вот что я делаю:

Листинг программы
  1. first([],[]):-write("Null!").
  2. first([H],H):-atom(H).
  3. first([H|_],R):-first(H,R),atom(R),!.
  4. first([H|_],R):-first([H|T],R).
  5. ?-first([[[s,a],b],c,[e,[f,[[g,e,p],v],y]],x],R),write(R),nl.

вот что выводит,все хорошо:

Листинг программы
  1. s
  2. Yes.
  3. No.

Но есть проблема если исправить список значений на:

Листинг программы
  1. ?-first([s,a,b],R),write(R),nl.

то выводит немного не правильно:

Листинг программы
  1. s
  2. Yes.
  3. s
  4. Yes.
  5. s
  6. Yes.
  7. s
  8. Yes.
и так до бесконечности Следующий шаг должен вывести "No".

Решение задачи: «Неправильное определение первого элемента списка»

textual
Листинг программы
  1. first([],[]):-write("Null!").
  2. first([H],H):-atom(H).
  3. first([H|_],R):-first(H,R),atom(R),!.
  4. first([H|_],R):-first([H|T],R).
  5.  
  6. first1([H|_], X) :-
  7.     nonvar(H),
  8.     H = [_|_],
  9.     first1(H, X).
  10. first1([H|_], H) :-
  11.     nonvar(H),
  12.     not( H = [_|_] ).
  13.  
  14. first2([H|_], H) :-
  15.     var(H),
  16.     !.
  17. first2([H|_], X) :-
  18.     H = [_|_],
  19.     first2(H, X).
  20. first2([H|_], H) :-
  21.     not( H = [_|_] ).
  22.  
  23. ?-first([s,a,b],R),write(R),nl.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы