Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2013, 18:59   #1
KATKAT
 
Регистрация: 13.12.2012
Сообщений: 3
Восклицание SWI Prolog.Удаление n-того элемента списка.Вывести парные простые числа

Добрый вечер!! Дали задание на SWI Prolog написать две такие задачки:
1.Найти n-ый элемент в списке и удалить все его копии и вывести новый список.
2. На основе данного списка вывести пары простых чисел близнецов (то есть разница которых равна 2).

Знаю, что задачи не сложные, но не могу я логически программировать. Вот наработки по задачам..
Заранее спасибо.

PHP код:
%1 задача.
positions(L,X,Res):- positions1(L,X,Res,1).
positions1([],X,[],_).
positions1([H|T],X,L,Pos):-X<>H,!,positions1(T,X,L,Pos+1).
positions1([H|T],X,[Pos|L],Pos):-X=H,positions1(T,X,L,Pos+1).
positions1(L,X,Res):- positions1(L,X,Res,1).
positions1([],_,[],_).
positions1([H|T],X,L,Pos):-X=\=H,!,P1 is Pos+1,positions1(T,X,L,P1).
positions1([H|T],X,[Pos|L],Pos):-X==H,P1 is Pos+1,positions1(T,X,L,P1). 
PHP код:
2 задача
%чи натуральне число.
isNatural(1).
isNatural(N):-N>1,N1 is N-1,isNatural(N1).

checkNatural(N):-isNatural(N),!.
checkNatural(N):-write(N),write('-is not natural!'),!,fail.

%
формуємо список натуральних чисел від 1 до 25
listNatUntil
(N,List):-checkNatural(N),listNatUntil1(N,List).
listNatUntil1(1,[1]):-!.
listNatUntil1(N,[N|L1]):-N1 is N-1,listNatUntil1(N1,L1).
рахуємо,скільки дільників має число у даному списку(для простого не
більше 2)
countDivInList(N,List,Count):-checkNatural(N),countDivInList1(N,List,Count).
countDivInList1(N,[],0).
countDivInList1(N,[H|T],Count):-0=:=(N mod H),!,countDivInList(N,T,C),Count is C+1.
countDivInList1
(N,[H|T],C):-countDivInList1(N,T,C).
%
перевіряємо чи є число просте
isSimple
(N):-checkNatural(N),listNatUntil(N,L),countDivInList(N,L,C),C=:=2.
%наступне просте число після попереднього
nextSimple
(N,Simple):-checkNatural(N),nextSimple1(N,Simple).
nextSimple1(N,N1):-N1 is N+1,isSimple(N1),!.
nextSimple1(N,Simple):-N1 is N+1,nextSimple1(N1,Simple).
%
список Н перших простих чисел
listSimple
(N,L):-checkNatural(N),listSimple1(N,L).
listSimple1(1,[1]):-!.
listSimple1(N,[Simple|Y]):-N1 is N-1,listSimple(N1,Y),Y=[H|T],nextSimple1(H,Simple).
%
рахуємо різницю чисел повинна бути 2.
abs
(N,M):-checkNatural(N),checkNatural(M),abs1(N,M).
abs1(N,M):-2=:=abs(M-N),!.

checkAbs(N,M):-abs(N,M),!.
checkAbs(N,M):-write(N,M),write('-are not abs=2!'),!,fail
то есть в первой надо как=то написать предикат удаление тех позиций что нам нужно.. а во второй дальше запуталась.помогите, пожайлуйста.!!!!
KATKAT вне форума Ответить с цитированием
Старый 25.04.2013, 04:15   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
1.Найти n-ый элемент в списке и удалить все его копии и вывести новый список.
обработка списков в Prolog
правило at вернет n-ный элемент

Код:
rm([], [], _):-!.
rm([H|T], R, H):-
  rm(T, R, H),!.
rm([H|T], [H|R], E):-
  rm(T, R, E).
удаление, не проверял.

Последний раз редактировалось rrrFer; 25.04.2013 в 04:24.
rrrFer вне форума Ответить с цитированием
Старый 25.04.2013, 04:22   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
2. На основе данного списка вывести пары простых чисел близнецов (то есть разница которых равна 2).
я бы не стал долго думать, взял бы все то же правило at и правило цикла for отсюда: циклы в Prolog. Часть 2

тебе надо 2 вложенных цикла типа
Код:
length(L, N), !, for(I, 0, N), for(J, I, N), at(EI, I, L), at(EJ, J, L), check(EI, EJ), assert(f(EI, EJ)), fail;!.
тут схемотично набросал, врядли заработает. И правило check должно проверять простоту чисел и т.п. По второй ссылке еще и правило проверки на простоту можно найти (isPrime).
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти парные простые числа в массиве JAVA KATKAT Помощь студентам 1 01.04.2013 23:19
Програмирование в SWI-Prolog Лина_Чер Помощь студентам 0 28.01.2013 20:18
Удаление из списка. Turbo Prolog Ketty_byyy Помощь студентам 1 23.05.2010 15:19
Удаление последнего элемента из списка и реверс этого списка. Goose Общие вопросы C/C++ 8 16.05.2010 16:12