Python

Помогите, плиз, язык пролог..!

Даны 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).
Глеб Попов
Глеб Попов
373
У вас слишком много предикатов. Зачем столько?

Повторюсь.
Нужно в одном предикате одновременно просматривать оба списка, а не так, как делаете вы: сначала в первом списке ищете номер элемента, затем по полученному номеру ищете элемент во втором списке.
Если делать одним предикатом, то различие в длине списков не имеет значения.

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.
Александр Патрушев
Александр Патрушев
51 590
Лучший ответ
вводишь элемент 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=' ')
если я правильно задачу понял)))
главное чтоб длина списков была одинакова или первый не больше второго иначе ошибку выдаст при индексе из первого списка большем чем длина второго
Александр Патрушев if, print, input? - это не Пролог.

Для Вероники.
Нужно в одном предикате одновременно просматривать оба списка, а не так, как делаете вы: сначала в первом списке ищете номер элемента, затем по полученному номеру ищете элемент во втором списке.
Если делать одним предикатом, то различие в длине списков не имеет значения.