Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 20.08.2011
Сообщений: 24
1

Обработка списков

23.08.2011, 22:14. Просмотров 1130. Ответов 8
Метки нет (Все метки)

Помогите пожайлуста!!!
Задание:
1. Создать список, состоящий из значений первых аргументов предикатов, которые сформированны в "Программе", которая находится ниже.
2. Распечатать список.
3. Подсчитать количество элементов в списке.
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
             "Программа":
domains
 
    атс=integer
    список_атс=атс*
    фамилия,телефон=string
    название_района=string
 
facts
 
    человек(фамилия,телефон,атс).
    район(название_района,список_атс).
 
predicates
 
    nondeterm входит_в_список(атс,список_атс).
    nondeterm проживает_в_районе(фамилия,название_района).
 
clauses
 
    человек("Иванов","123-45-67",123).
    человек("Петров","124-45-24",124).
    человек("Сидоров","250-45-76",250).
    человек("Ковалёв","320-45-64",320).
 
    район("Академическая",[123,124,125,126,135]).
    район("Салтовка",[310,320,330,340,350]).
    район("Основа",[210,220,230,240,250]).
 
    входит_в_список(H,[H|_]).
    входит_в_список(H,[_|Tail]):-входит_в_список(H,Tail).
 
    проживает_в_районе(Фамилия,Район):- человек(Фамилия,_,АТС),район(Район,СписокАТС),входит_в_список(АТС,СписокАТС).
 
goal
 
    проживает_в_районе("Иванов",Район).
    проживает_в_районе("Петров",Район).
    проживает_в_районе("Сидоров",Район).
    проживает_в_районе("Ковалёв",Район).
============================== ============================== =============
Зарание БОЛЬШОЕ СПАСИБО!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2011, 22:14
Ответы с готовыми решениями:

Обработка списков
В коде, в строке head_list(list). появилась ошибка No clauses for this predicate. Но...

Обработка списков
Даны два непустых списка целых чисел L1 и L2. Создать программу, которая строит список L3,...

Обработка списков
Помогите, пожалуйста, с задачей. Необходимо определить новые предикаты, которые работают со...

Обработка списков
Список состоит из букв и цифр, буквы оставить без изменения, а цифры умножить на 2.

8
2488 / 1463 / 36
Регистрация: 14.09.2009
Сообщений: 2,742
24.08.2011, 21:29 2
Prolog
1
2
3
4
5
6
goal
 
        проживает_в_районе("Иванов",Район).
        проживает_в_районе("Петров",Район).
        проживает_в_районе("Сидоров",Район).
        проживает_в_районе("Ковалёв",Район).
Так нельзя, в разделе goal не правила задаются, а то, что должна делать программа. Точка там может быть только одна - в конце. Поэтому можно сделать так
Prolog
1
2
3
4
5
6
goal
 
        проживает_в_районе("Иванов",Район1),
        проживает_в_районе("Петров",Район2),
        проживает_в_районе("Сидоров",Район3),
        проживает_в_районе("Ковалёв",Район4).
Добавьте в domains
фамилии=фамилия*
И теперь
goal
findall(Фамилия,человек(Фамили я,_,_),Фамилии).
А предикаты вывода списка на экран, подсчета длины и нахождения элемента много раз встречались, воспользуйтесь поиском.
1
0 / 0 / 0
Регистрация: 20.08.2011
Сообщений: 24
25.08.2011, 12:23  [ТС] 3
Спасибо!!!

Добавлено через 7 часов 13 минут
Насчёт 1-го пункта я так понял нужно вот так сделать!?
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
domains
 
    атс=integer
    список_атс=атс*
    фамилия,телефон=string
    название_района=string
    фамилии=фамилия*
 
facts
 
    человек(фамилия,телефон,атс).
    район(название_района,список_атс).
 
predicates
 
    nondeterm входит_в_список(атс,список_атс).
    nondeterm проживает_в_районе(фамилия,название_района).
 
clauses
 
    человек("Иванов","123-45-67",123).
    человек("Петров","124-45-24",124).
    человек("Сидоров","250-45-76",250).
    человек("Ковалёв","320-45-64",320).
 
    район("Академическая",[123,124,125,126,135]).
    район("Салтовка",[310,320,330,340,350]).
    район("Основа",[210,220,230,240,250]).
 
    входит_в_список(H,[H|_]).
    входит_в_список(H,[_|Tail]):-входит_в_список(H,Tail).
 
    проживает_в_районе(Фамилия,Район):- человек(Фамилия,_,АТС),район(Район,СписокАТС),входит_в_список(АТС,СписокАТС).
 
goal
 
    findall(Фамилия,человек(Фамилия,_,_),Фамилии).
А вот остальные я не могу сделать(( Поискал на сайте, но чё-то ничего не нашол!(
0
2488 / 1463 / 36
Регистрация: 14.09.2009
Сообщений: 2,742
25.08.2011, 19:31 4
Да, 1й пункт так. Остальные предикаты встречаются на форуме, и очень часто, просто специальных тем для них нету. Это азы пролога, и если Вы и такие элементарные задачи сделать не можете, то Вы точно этот предмет не сдадите. Так что лучше постарайтесь написать самостоятельно. А уж если не получится, то с исправлением ошибок я помогу.
0
0 / 0 / 0
Регистрация: 20.08.2011
Сообщений: 24
27.08.2011, 14:06  [ТС] 5
Вот всё что я смог сделать...да и то походу неправильно!((

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
domains
 
    атс=integer
    список_атс=атс*
    фамилия,телефон=string
    название_района=string
    фамилии=фамилия*
    список = integer*
    вывести_список(список)
 
facts
 
    человек(фамилия,телефон,атс).
    район(название_района,список_атс).
 
predicates
 
    nondeterm входит_в_список(атс,список_атс).
    nondeterm проживает_в_районе(фамилия,название_района).
 
clauses
 
    человек("Иванов","123-45-67",123).
    человек("Петров","124-45-24",124).
    человек("Сидоров","250-45-76",250).
    человек("Ковалёв","320-45-64",320).
 
    район("Академическая",[123,124,125,126,135]).
    район("Салтовка",[310,320,330,340,350]).
    район("Основа",[210,220,230,240,250]).
 
    входит_в_список(H,[H|_]).
    входит_в_список(H,[_|Tail]):-входит_в_список(H,Tail).
 
    проживает_в_районе(Фамилия,Район):- человек(Фамилия,_,АТС),район(Район,СписокАТС),входит_в_список(АТС,СписокАТС).
 
    вывести_список([],N):-N=0.
    вывести_список([Г|Х],N) :-
    write(Г), nl,
    вывести_список(Х,N1),
    N=N1+1.
 
goal
 
    findall(Фамилия,человек(Фамилия,_,_),Фамилии).
    
    вывести_список([1, 2, 3]).
Больше ничего не получается сделать! Я в тупике, а сдавать уже в понедельник (
Помогите пожайлуста!!! Буду очень благодарен!!!
0
2488 / 1463 / 36
Регистрация: 14.09.2009
Сообщений: 2,742
27.08.2011, 19:48 6
Ну неужели Вы даже компилятор скачать не можете? Не забывайте, что все предикаты надо отмечать в разделе predicates. Далее, в предикате "вывести_список", кроме самого вывода еще и считается количество элементов в списке, так что 2-3 пункты выполнены. 4й пункт я не очень поняла, если имеется в виду, что выдать индекс искомого вещества, то так
Prolog
1
2
search(X,[X|_],1).
search(X,[_|Tail],N):-search(X,Tail,N1),N=N1+1.
1
0 / 0 / 0
Регистрация: 20.08.2011
Сообщений: 24
28.08.2011, 18:12  [ТС] 7
Я так понял, что строку:
Prolog
1
вывести_список(список)
нужно из domains пемеместить в predicates и всё, первые три пункта готовы?!
0
2488 / 1463 / 36
Регистрация: 14.09.2009
Сообщений: 2,742
28.08.2011, 19:06 8
Поставьте компилятор и сами проверяйте! В данном случае не все, т.к в предикате вывести_список у Вас где 1 параметр, а где и 2. Там, где 2, там считается и длина, так что надо исправить места, где 1.
0
0 / 0 / 0
Регистрация: 20.08.2011
Сообщений: 24
28.08.2011, 22:17  [ТС] 9
Чё-то я не совсем пойму где надо исправить!(

Можете, пожайлуста, написать правильно программу? Буду очень благодарен!!!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2011, 22:17

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

Рекурсивная обработка списков
Напишите предикат, находящий минимальный и максимальный элементы списка.

Обработка соответствующих элементов двух списков и формирование третьего
Даны два списка одинаковой длины. Получить третий список, каждый элемент равен 1, если элементы...

Обработка списков: вводы, разность, получение длины и сортировка [Arity]
помогите с прогой на Arity prolog?! организовать ввод и формирование двух символьных списков.Найти...

Определить, какой из списков меньше (как по значениям элементов, так и по длинам подсписков и самих списков)
Даны списки списков чисел l1 и l2. Определить, какой из списков меньше (как по значениям...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.