Дан список, объектами которого являются числа - Prolog

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

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

Оставить те элементы списка, которые не являются числами Фибоначчи. Помогите, в чём может быть ошибка? Заранее спасибо.
Листинг программы
  1. domains
  2. n=integer*
  3. predicates
  4. member(integer,n)
  5. zad3(n,integer,n)
  6. elem(integer,integer,integer,integer)
  7. remove(integer,n,n)
  8. clauses
  9. remove(_,[],[]) :-!.
  10. remove(X,[X|T],W):- remove(X,T,W),!.
  11. remove(X,[Y|T],[Y|W]):- remove(X,T,W). % удаляет из строки все символы X
  12. elem(2,_,Y,Y):-!.
  13. elem(X,A,B,N):- C=B+A, X1=X-1, elem(X1,B,C,N). % по номеру X определяет число в последовательности Фиббоначи
  14. member(X,[X|_]).
  15. member(X,[_|T]) :- member(X,T). % поиск
  16.  
  17. zad3([],W,[]):-!.
  18. zad3(A,W,C) :- W1=W+1, elem(W1,0,1,B), member(B, A), zad3(A, W1, C); W1=W+1, elem(W1,0,1,B), remove(B,A,C1), zad3(A, W1, C1). % W - счетчик
  19.  
  20. goal
  21. readterm(n,A), zad3(A,0,C), write(C).

Решение задачи: «Дан список, объектами которого являются числа»

textual
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4.  
  5. predicates
  6. isSqu(int)
  7. isFib(int)
  8. delFib(intl,intl)
  9.  
  10. clauses
  11. isSqu(N) :- M=sqrt(N), Z=trunc(M), N=Z*Z.
  12.  
  13. isFib(N) :- F1=5*N*N-4, isSqu(F1); F2=5*N*N+4, isSqu(F2).
  14.  
  15. delFib([],[]).
  16. delFib([H|T],[H|R]) :- not(isFib(H)), delFib(T,R), !.
  17. delFib([H|T],R)     :- isFib(H), delFib(T,R), !.

Объяснение кода листинга программы

  1. В коде дано три predicate (предположение, факт, функция):
    • isSqu(N) — проверяет является ли число N квадратом целого числа.
    • isFib(N) — проверяет является ли число N числом Фибоначчи.
    • delFib(L,R) — удаляет из списка L все элементы, которые не являются числами Фибоначчи.
  2. В коде дано три domain (область определения):
    • int=integer — число
    • intl=int* — список чисел
    • Z=trunc(M) — результат округления числа M до целого числа, при этом M — результат вычисления квадратного корня из числа N.
  3. В первом утверждении isSqu(N) :- M=sqrt(N), Z=trunc(M), N=Z*Z. происходит вычисление квадратного корня из числа N и проверка является ли результат квадратом целого числа.
  4. Во втором утверждении isFib(N) :- F1=5NN-4, isSqu(F1); F2=5NN+4, isSqu(F2). проверяется является ли число N числом Фибоначчи. Если число N не является числом Фибоначчи, то вторая часть утверждения не будет проверена с помощью ;.
  5. В третьем утверждении delFib([],[]). определено базовое правило для пустого списка.
  6. В четвертом утверждении delFib([H|T],[H|R]) :- not(isFib(H)), delFib(T,R), !. определено правило для не пустого списка. Если элемент H не является числом Фибоначчи, то он удаляется из списка L, а список R остается без изменений.
  7. В пятом утверждении delFib([H|T],R) :- isFib(H), delFib(T,R), !. определено правило для не пустого списка. Если элемент H является числом Фибоначчи, то он добавляется в список R, а список T остается без изменений.

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


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

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

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

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

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

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