Даны 2 списка, необходимо написать программу, которая по введенному с клавиатуры элементу списка 1 возвращает соответствующий по номеру элемент в списке 2.
Эту задачу я решила, но как сделать, если в первом списке есть несколько элементов, соответствующих введенному элементу.. Необходимо вывести все соответствующие элементы из списка 2
domains
number = integer
list = integer *
predicates
read_list (list)
read_list2 (list)
write_list (list)
write_list2 (list)
find_n (number, list)
num(list,number,number)
run
find(number,list)
goal
run.
clauses
run:-
write("введите элементы списка 1\n "),read_list(Lst),nl,write ("Введите элементы списка 2 \n"),read_list2(Lst2),nl, write ("Введите элемент списка 1: "), readint(A),nl,num(Lst,A,N),write("номер этого элемента в списке 1: "),nl,
write(N),nl,write("номер элемента из списка 2, соответствующий по номеру из списка 1 : "),nl, find_n(N,Lst2).
read_list ([H|T]) :- readint (H), !,read_list (T).
read_list ([]).
read_list2 ([H|T]) :- readint (H), !,read_list (T).
read_list2 ([]).
/*__________________________*/
write_list ([]).
write_list ([Head|Tail]) :- write (Head),write (""), write_list (Tail).
write_list2 ([]).
write_list2 ([Head|Tail]) :- write (Head),write (""), write_list (Tail).
/*---------------------------------*/
/*------------------------------------*/
num([X|_],X,1).
num([_|T],X,N):-
num(T,X,N1),
N=N1+1.
/*----------------------------------*/
/*------------------------------------*/
find_n (Middle, [_|Tail]) :- Middle1=Middle-1, Middle1>0,
find_n (Middle1, Tail).
find_n (_, [Head|_]) :- write (Head),write (", ").
/*----------------------------------*/
find(H,[H|_]).
find(H,[_|T]):-find(H,T).
Python
Помогите, плиз, язык пролог..!
У вас слишком много предикатов. Зачем столько?
Повторюсь.
Нужно в одном предикате одновременно просматривать оба списка, а не так, как делаете вы: сначала в первом списке ищете номер элемента, затем по полученному номеру ищете элемент во втором списке.
Если делать одним предикатом, то различие в длине списков не имеет значения.
domains
list = integer*
predicates
find(integer, list, list, list)
read_list(list)
run
clauses
find(N, [H | T], [H1 | T1], [H2 | T2]) :- find(N, T, T1, T2), N = H, H1 = H2, !.
find(N, [_ | T], [_ | T1], T2) :- find(N, T, T1, T2), !.
find(_, [ ], _, [ ]).
find(_, _, [ ], [ ]).
read_list([H | T]) :- readint(H), !,read_list(T).
read_list([ ]).
run :- write("Введите 1-й список: "), nl, read_list(L1),
write("Введите 2-й список: "), nl, read_list(L2),
write("Введите элемент 1-го списка: "), readint(A), nl,
find(A, L1, L2, L),
write("Список соответствующих элементов: "), nl, write(L).
goal
run.
Повторюсь.
Нужно в одном предикате одновременно просматривать оба списка, а не так, как делаете вы: сначала в первом списке ищете номер элемента, затем по полученному номеру ищете элемент во втором списке.
Если делать одним предикатом, то различие в длине списков не имеет значения.
domains
list = integer*
predicates
find(integer, list, list, list)
read_list(list)
run
clauses
find(N, [H | T], [H1 | T1], [H2 | T2]) :- find(N, T, T1, T2), N = H, H1 = H2, !.
find(N, [_ | T], [_ | T1], T2) :- find(N, T, T1, T2), !.
find(_, [ ], _, [ ]).
find(_, _, [ ], [ ]).
read_list([H | T]) :- readint(H), !,read_list(T).
read_list([ ]).
run :- write("Введите 1-й список: "), nl, read_list(L1),
write("Введите 2-й список: "), nl, read_list(L2),
write("Введите элемент 1-го списка: "), readint(A), nl,
find(A, L1, L2, L),
write("Список соответствующих элементов: "), nl, write(L).
goal
run.
вводишь элемент 1 списка. перебираешь список по индексам и при совпадении введенного элемента и элемента с индексом в списке получаешь его индекс. по полученному индексу выводишь элемент из второго списка
spisok_1['Даны','2','списка','необходимо','написать','2','программу','2','которая','по','введенному']
spisok_2=['Эту','задачу','я','решила','но','как','сделать','если','в','первом','по','введенному']
vvod=input('Ввод элемента 1 списка>>> ')
for i in range(len(spisok_1)) :
..if spisok_1[i] == vvod :
....print (spisok_2[i],end=' ')
если я правильно задачу понял)))
главное чтоб длина списков была одинакова или первый не больше второго иначе ошибку выдаст при индексе из первого списка большем чем длина второго
spisok_1['Даны','2','списка','необходимо','написать','2','программу','2','которая','по','введенному']
spisok_2=['Эту','задачу','я','решила','но','как','сделать','если','в','первом','по','введенному']
vvod=input('Ввод элемента 1 списка>>> ')
for i in range(len(spisok_1)) :
..if spisok_1[i] == vvod :
....print (spisok_2[i],end=' ')
если я правильно задачу понял)))
главное чтоб длина списков была одинакова или первый не больше второго иначе ошибку выдаст при индексе из первого списка большем чем длина второго
Похожие вопросы
- Задача помогите плиз
- Программирование на языке python, помогите советом. Вопрос от чайника.
- Задача по программированию. Помогите пожалуйста)) Скидывайте, пожалуйста, на любых языках, я все пойму!
- Помогите пожалуйста исправить мой код на языке питон
- Помогите пж, я новичок в языке python.
- Плиз помогите с Python
- Помогите с инфой плиз. Python
- Как можно быстро выучить языки?
- Язык программирования и
- Как стать программистом, как выучить язык?
Для Вероники.
Нужно в одном предикате одновременно просматривать оба списка, а не так, как делаете вы: сначала в первом списке ищете номер элемента, затем по полученному номеру ищете элемент во втором списке.
Если делать одним предикатом, то различие в длине списков не имеет значения.