Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 15
1

Предикат определения множества объединения двух списков

25.05.2015, 17:27. Показов 1873. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста с заданием:
Создать предикат определения множества объединения двух списков.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2015, 17:27
Ответы с готовыми решениями:

Создать предикат определения множества пересечения двух списков
хеееелп ми Создать предикат определения множества пересечения двух списков

Определить предикат для объединения элементов двух списков, находящихся в диапазоне от N1 до N2
Друзья, здравствуйте! Подскажите пожалуйста, как решить поставленную задачу: "Определить предикат...

Создать предикат нахождения множества объединения трех множеств
Создать предикат нахождения множества объединения трех множеств с вводом списков с клавиатуры

Создать предикат нахождения объединения пересечения первых двух множеств с третьим
Создать предикат нахождения множества, которое получается в результате выполнения следующих...

10
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
28.05.2015, 09:41 2
Имеется в виду, что каждый список есть множество (т.е. состоит из уникальных элементов)?
0
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 15
28.05.2015, 11:51  [ТС] 3
Да.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
28.05.2015, 12:35 4
Вот один из способов:

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
domains
int=integer
intl=int*
 
predicates
app(intl,intl,intl)
memb(int,intl)
setof(intl,intl)
union(intl,intl,intl)
 
clauses
app([],X,X).
app([H|T],X,[H|Y]) :- app(T,X,Y).
 
memb(_,[]) :- fail.
memb(H,[H|_]) :- !.
memb(H,[_|T]) :- memb(H,T).
 
setof([],[]).
setof([H|T],[H|Q]) :- not(memb(H,T)), setof(T,Q).
setof([H|T],Q)     :- memb(H,T), setof(T,Q).
 
union(X,Y,Z) :- app(X,Y,T), setof(T,Z).
Добавлено через 4 минуты
Но это решение избыточно. Если исходные списки уже являются множествами, то проще так:

Prolog
1
2
3
uni([],X,X).
uni([H|T],X,[H|Y]) :- not(memb(H,X)), uni(T,X,Y).
uni([H|T],X,Y)     :- memb(H,X), uni(T,X,Y).
0
5 / 5 / 0
Регистрация: 04.10.2015
Сообщений: 30
27.11.2015, 17:09 5
а можно как-то реализовать только объединение 2-х списков без оператора отсечения?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
27.11.2015, 17:34 6
innnochka, объединение (app) не использует отсечения...
0
5 / 5 / 0
Регистрация: 04.10.2015
Сообщений: 30
27.11.2015, 17:46 7
а она именно и выполняет задачу из 2 списков создать 3-ий который есть их объединение?
т.е. вводим: [1,2,4,5] и [1,2,3,6]. выводит: [1,2,3,4,5,6]
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
27.11.2015, 18:05 8
innnochka, нет, у тебя объединение множеств. app([1,2,4,5],[1,2,3,6],R) даст R=[1,2,4,5,1,2,3,6]
0
5 / 5 / 0
Регистрация: 04.10.2015
Сообщений: 30
27.11.2015, 18:08 9
Не могли бы вы помочь с такой программой?
т.е. надо еще написать проверку есть ли символ из 2 списка уже есть в первом, то тогда его надо добавить только 1 раз в итоговый список..
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
28.11.2015, 23:08 10
innnochka, так это все уже было решено.
0
5 / 5 / 0
Регистрация: 04.10.2015
Сообщений: 30
29.11.2015, 09:29 11
вCatstail, в функции memb используется оператор отсечения. Возможно ли написать программу без этого оператора?
Prolog
1
2
3
memb(_,[]) :- fail.
memb(H,[H|_]) :- !.
memb(H,[_|T]) :- memb(H,T).
Добавлено через 21 минуту
Prolog
1
2
3
4
5
6
7
8
9
10
11
app([],X,X).
app([H|T],X,[H|Y]) :- app(T,X,Y). 
 
memb(H, [ H | _ ] ) .
memb( Elem, [ _ | T ] ):-memb(Elem, T ).
 
setof([],[]).
setof([H|T],[H|Q]) :- not(memb(H,T)), setof(T,Q).
setof([H|T],Q)     :- memb(H,T), setof(T,Q).
 
union(X,Y,Z) :- app(X,Y,T), setof(T,Z).
вот,готово) этот код и дает ответ на мою задачу, где нет оператора отсечения вообще)
1
29.11.2015, 09:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.11.2015, 09:29
Помогаю со студенческими работами здесь

Создайте предикат, поэлементно перемножающий соответствующие элементы двух одноуровневых списков
Создайте предикат, осуществляющий поэлементное перемножение соответствующих элементов двух исходных...

Предикат. Сумма элементов двух списков наиболее близка к заданному чилу
p(X, Y, Q, -S) X и Y - упорядоченные по возрастанию списки, Q - число Предикат истинный тогда и...

Список: Используя предикат принадлежности элемента списку, разработать функцию, находящую объединение двух списков.
Используя предикат принадлежности элемента списку разработать функцию находящую...

Определить предикат выполняющий арифметическую операцию над элементами двух числовых списков равной длины
Здравствуйте! Помогите написать предикат на прологе. Определите предикат make(Op,L1,L2,R),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru