Ограничение на добавление в список повторяющихся элементов - Prolog
Формулировка задачи:
Здравствуйте. Преподаватель дал задачу изменить программу так, чтобы когда использовалась первая функция(при нажатии цифры 1), то в список не добавлялись повторяющиеся элементы(числа). Как я понял, сначала мы должны записать в список любые числа, не зависимо от того, повторяются они или нет, а затем уже провести некую проверку на повторяющиеся числа и удалить их, оставив только одно.
Вот только я так и не понял как лучше сделать:
- чтобы число после считывания сразу проверялось на наличие подобного ему в списке
- или все-таки проверять весь список после окончания считывания и удалять/заменять одинаковые числа до тех пор, пока не останется только одно.
На функции insert я уже запутался, не знаю как раскрутить все это дело(
Использую Visual Prolog 5.2 (в универе стоит такая же версия).
Очень хотелось бы получить ответ до завтрашнего утра, так как мне потом придется долго ждать до следующей сдачи!
. Код:
Листинг программы
- DOMAINS
- list=integer*
- number_list=integer*.
- %I=integer.
- %R=integer.
- PREDICATES
- nondeterm run(list)
- nondeterm do(integer, list, list)
- nondeterm create_list(list,list)
- nondeterm create_list_interval(integer, integer, list, list)
- nondeterm insert(integer,list,list)
- nondeterm member(integer,list)
- nondeterm replace(integer,integer,list,list)
- nondeterm del(list)
- nondeterm del_otr(list,list)
- nondeterm g(integer,integer,integer,list)
- CLAUSES
- run(L):-write("\nType 1 to create a new list\n"),
- write ("Type 2 to create a new list with interval from N1 to N2.\n"), %
- write("Type 3 to show list at the screen\n"),
- write("Type 4 to replace elements\n"), %
- write("Type 5 to get the random list\n"), %
- write("Type 6 to delete list\n"), %
- write("Type 7 to delete negative elements only\n"), %
- write("Type 8 to be able to exit with 'ESC'\n"),
- write("->"),
- readchar(X),
- write(X,"\n"),
- do(X,L,NewL),
- run(NewL).
- do('1',L,NewL):-
- write("Type list elements:\n"),
- create_list(L,NewL).
- do ('2', L, NewL):- write("\nType N1: \n"), readint(X), write("\nType N2: \n"), readint(Y), create_list_interval(X,Y,L,NewL).
- do('3',L,L):-
- nl, write(L), nl.
- do('4',L,NewL):-nl, write("Type element which need to be replaced:\n"),
- readint(R1),write("Type new element:\n"), readint(R2),
- replace(R1,R2,L,NewL),
- write(NewL).
- do('5',_,NewL):-nl, g(10,1,10,NewL),
- write(NewL).
- do('6',_,NewL):-nl, del(NewL),
- write(NewL).
- do ('7', L, L):- del_otr(L,L1),write("List without negative elements : ", L1, "\n").
- do('8',L,L):-nl,exit.
- create_list(L, NewL):-readint(X),X<>'\27',
- insert(X, L, [X|L]),
- create_list([X|L], NewL).
- create_list(L, L).
- create_list_interval(X,Y,L,L):- X>Y, !, write("\nList of elements with interval from N1 to N2: ",L).
- create_list_interval(X,Y,L,NewL):- insert(X,L,TempL), NewX=X+1, create_list_interval(NewX,Y,TempL,NewL).
- %insert(X,L,L). не
- %insert(X,L,L):-insert(X,L,L),member(X,L),!. рабочая
- %insert(X,L,[X|L]):-insert(X,L,L). часть
- %insert(X, L,L):- member(X, L),!.
- %insert(X, L, [X|L]).
- member(X,[X|_]).
- member(X,[_|L]):-member(X,L).
- replace(Elem,NewElem,[Elem|L],[NewElem|L1]):-!,replace(Elem,NewElem,L,L1).
- replace(Elem,NewElem,[Member|L],[Member|L1]):-replace(Elem,NewElem,L,L1).
- replace(_,_,[],[]).
- del([]):-!.
- del_otr([], []):- write("List is empty!\n").
- del_otr([H|T], L):- H<0, !, del_otr(T, L).
- del_otr([H|T], [H|T1]):- del_otr(T, T1).
- g(0,_,_,[]):-!.
- g(N,M,K,[H|Tail]):-N1=N-1, g(N1,M,K,Tail),
- A=K+1-M, random(A,B), H=B+M.
- GOAL
- run([]).
Решение задачи: «Ограничение на добавление в список повторяющихся элементов»
textual
Листинг программы
- create_list(L, NewL) :-
- readint(X), X<>'\27', % <--- И это работает? Надо будет проверить..
- !, % <--- в любом случае здесь необходимо отсечение, я только что об этом писал
- insert(X, L, OtherL),
- create_list(OtherL, NewL).
- create_list(L, L).
- insert(X, L, L) :-
- member(X, L),
- !.
- insert(X, L, [X|L]).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д