Дан список, объектами которого являются числа - Prolog
Формулировка задачи:
Оставить те элементы списка, которые не являются числами Фибоначчи.
Помогите, в чём может быть ошибка? Заранее спасибо.
Листинг программы
- domains
- n=integer*
- predicates
- member(integer,n)
- zad3(n,integer,n)
- elem(integer,integer,integer,integer)
- remove(integer,n,n)
- clauses
- remove(_,[],[]) :-!.
- remove(X,[X|T],W):- remove(X,T,W),!.
- remove(X,[Y|T],[Y|W]):- remove(X,T,W). % удаляет из строки все символы X
- elem(2,_,Y,Y):-!.
- elem(X,A,B,N):- C=B+A, X1=X-1, elem(X1,B,C,N). % по номеру X определяет число в последовательности Фиббоначи
- member(X,[X|_]).
- member(X,[_|T]) :- member(X,T). % поиск
- zad3([],W,[]):-!.
- 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 - счетчик
- goal
- readterm(n,A), zad3(A,0,C), write(C).
Решение задачи: «Дан список, объектами которого являются числа»
textual
Листинг программы
- domains
- int=integer
- intl=int*
- predicates
- isSqu(int)
- isFib(int)
- delFib(intl,intl)
- clauses
- isSqu(N) :- M=sqrt(N), Z=trunc(M), N=Z*Z.
- isFib(N) :- F1=5*N*N-4, isSqu(F1); F2=5*N*N+4, isSqu(F2).
- delFib([],[]).
- delFib([H|T],[H|R]) :- not(isFib(H)), delFib(T,R), !.
- delFib([H|T],R) :- isFib(H), delFib(T,R), !.
Объяснение кода листинга программы
- В коде дано три predicate (предположение, факт, функция):
- isSqu(N) — проверяет является ли число N квадратом целого числа.
- isFib(N) — проверяет является ли число N числом Фибоначчи.
- delFib(L,R) — удаляет из списка L все элементы, которые не являются числами Фибоначчи.
- В коде дано три domain (область определения):
- int=integer — число
- intl=int* — список чисел
- Z=trunc(M) — результат округления числа M до целого числа, при этом M — результат вычисления квадратного корня из числа N.
- В первом утверждении isSqu(N) :- M=sqrt(N), Z=trunc(M), N=Z*Z. происходит вычисление квадратного корня из числа N и проверка является ли результат квадратом целого числа.
- Во втором утверждении isFib(N) :- F1=5NN-4, isSqu(F1); F2=5NN+4, isSqu(F2). проверяется является ли число N числом Фибоначчи. Если число N не является числом Фибоначчи, то вторая часть утверждения не будет проверена с помощью ;.
- В третьем утверждении delFib([],[]). определено базовое правило для пустого списка.
- В четвертом утверждении delFib([H|T],[H|R]) :- not(isFib(H)), delFib(T,R), !. определено правило для не пустого списка. Если элемент H не является числом Фибоначчи, то он удаляется из списка L, а список R остается без изменений.
- В пятом утверждении delFib([H|T],R) :- isFib(H), delFib(T,R), !. определено правило для не пустого списка. Если элемент H является числом Фибоначчи, то он добавляется в список R, а список T остается без изменений.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д