Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 24.02.2016
Сообщений: 20

Как реализовать полный проход по списку?

28.02.2016, 11:14. Показов 2952. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Использую AMZI Prolog.
Есть несколько предикатов:
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
48
49
50
51
52
53
54
55
price(Arg,[],[]).
price(Arg,[H|T],T1):-
    arg(2,H,Ha),
    Arg \= Ha,!,
    price(Arg,T,T1).
price(Arg,[H|T],[H|T1]):-
    price(Arg,T,T1).
    
suit(Arg,[],[]).
suit(Arg,[H|T],T1):-
    arg(1,H,Ha),
    Arg \= Ha,!,
    suit(Arg,T,T1).
suit(Arg,[H|T],[H|T1]):-
    suit(Arg,T,T1).     
 
length([], 0).
length([H|T], N):-
    length(T, M),
    N is M+1.
    
append([],L,L).
append([X|L1],L2,[X|L3]):-
    append(L1,L2,L3).
    
reverse([],[]).
reverse([X|L1],L2):-
    reverse(L1,L3),
    append(L3,[X],L2).
    
sort_reverse([],[]).
sort_reverse(L,M):-
    sort(L,L1),
    reverse(L1,M).
    
joker_num([],0).
joker_num([H|T],N):-
    arg(1,H,K),
    K=joker,
    joker_num(T,N1),
    N is N1 + 1;
    arg(1,H,K),
    K \= joker,
    joker_num(T,N).
    
row([H|T],Row):-
    arg(1,H,Arg),
    suit(Arg,[H|T],TRow),
    length(TRow,N),
    N>=3,
    sort_reverse(TRow,Row);
    arg(2,H,Arg),
    price(Arg,[H|T],Row),
    length(Row,N),
    N>=3.
Как сделать так, чтобы предикат row, проходил по всему списку?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.02.2016, 11:14
Ответы с готовыми решениями:

Проход по списку
Вот код: numbers = sequence = j = 0 i = 0 while j + 3 != len(numbers): j += 1 for i in numbers: sequence.append(i)

Проход по списку с удаление элементов
Доброе время суток, есть ArrayList<Object>(); нужно: 1. взять элемент 2. выполнить действие с элементом 3. удалить элемент из...

Рекурсивный проход по списку. Вложенность
По следам недавней темы. Дается список '(a b c (d e (f g (O U Y))) j x y) нужно получить '("abc"...

14
0 / 0 / 0
Регистрация: 24.02.2016
Сообщений: 20
15.01.2019, 07:09  [ТС]
Как изменить предикат row так, чтобы он выдавал все возможные комбинации? Пробовал рекурсию, но не получилось.
0
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
15.01.2019, 11:54
Цитата Сообщение от vibor Посмотреть сообщение
Как изменить предикат row так, чтобы он выдавал все возможные комбинации? Пробовал рекурсию, но не получилось.
Дайте тестовые данные.
Кстати, почему AMZI Prolog?
Нет, AMZI Prolog это серьезный подход, но все-таки...

Добавлено через 35 минут
Цитата Сообщение от vibor Посмотреть сообщение
Пробовал рекурсию, но не получилось.
Что значит не получилось? Покажите...
0
0 / 0 / 0
Регистрация: 24.02.2016
Сообщений: 20
15.01.2019, 13:00  [ТС]
AMZI Prolog потому, что он интегрируется с Delphi.

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
48
49
50
51
52
53
54
55
56
57
price(Arg,[],[]).
price(Arg,[H|T],T1):-
    arg(2,H,Ha),
    Arg \= Ha,!,
    price(Arg,T,T1).
price(Arg,[H|T],[H|T1]):-
    price(Arg,T,T1).
    
suit(Arg,[],[]).
suit(Arg,[H|T],T1):-
    arg(1,H,Ha),
    Arg \= Ha,!,
    suit(Arg,T,T1).
suit(Arg,[H|T],[H|T1]):-
    suit(Arg,T,T1).     
 
length([], 0).
length([H|T], N):-
    length(T, M),
    N is M+1.
    
append([],L,L).
append([X|L1],L2,[X|L3]):-
    append(L1,L2,L3).
    
reverse([],[]).
reverse([X|L1],L2):-
    reverse(L1,L3),
    append(L3,[X],L2).
    
sort_reverse([],[]).
sort_reverse(L,M):-
    sort(L,L1),
    reverse(L1,M).
    
joker_num([],0).
joker_num([H|T],N):-
    arg(1,H,K),
    K=joker,
    joker_num(T,N1),
    N is N1 + 1;
    arg(1,H,K),
    K \= joker,
    joker_num(T,N).
    
row([], []).
row([H|T],T1):-
    arg(1,H,Arg),
    suit(Arg,[H|T],TRow),
    length(TRow,N),
    N>=3,
    sort(TRow,T1);
    arg(2,H,Arg),
    price(Arg,[H|T],T1),
    length(T1,N),
    N>=3,
    row(T, T1).
Ответ выдан:

?- row([c(c,1), c(c,2), c(c,3), c(h,1), c(d,1)], L).

L = [c(c, 1), c(c, 2), c(c, 3)] ;
no

А должен быть ещё один вариант:

[c(c, 1), c(h, 1), c(d, 1)]. Когда рекурсии нет то он выводится.

Добавлено через 3 минуты
Хотелось бы, чтобы проходился весь список.
0
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
15.01.2019, 15:04
Цитата Сообщение от vibor Посмотреть сообщение
AMZI Prolog потому, что он интегрируется с Delphi.
А реально интегрировать уже пробовали?

Добавлено через 11 минут
Цитата Сообщение от vibor Посмотреть сообщение
Как сделать так, чтобы предикат row, проходил по всему списку?
Это?
Prolog
1
2
?- findall(L, row([c(c,1), c(c,2), c(c,3), c(h,1), c(d,1)], L), LL).
LL = [[c(c, 3), c(c, 2), c(c, 1)], [c(c, 1), c(h, 1), c(d, 1)]].
0
0 / 0 / 0
Регистрация: 24.02.2016
Сообщений: 20
16.01.2019, 00:54  [ТС]
А у меня почему- то выдало:

?- findall(L, row([c(c,1), c(c,2), c(c,3), c(h,1), c(d,1)], L), LL).

L = H150
LL = [[c(c, 1), c(c, 2), c(c, 3)]]

Добавлено через 1 минуту
Для Delphi есть компонент, который есть на сайте AMZI Prolog.

Добавлено через 34 минуты
Виноват, забыл удалить рекурсию.

?- findall(L, row([c(c,1), c(c,2), c(c,3), c(h,1), c(d,1)], L), LL).

L = H150
LL = [[c(c, 1), c(c, 2), c(c, 3)], [c(c, 1), c(h, 1), c(d, 1)]]

Почему выдаётся неопределённый L?
0
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
16.01.2019, 09:50
Цитата Сообщение от vibor Посмотреть сообщение
Почему выдаётся неопределённый L?
Видимо, особенность AMZI Prolog. Он подчеркивает, что L не определен, так оно было до, так оно есть и после конструкции findall. Особенность такая, findall работает на откате, как если бы
Prolog
1
row([c(c,1), c(c,2), c(c,3), c(h,1), c(d,1)], L), assert(res_row(L)), fail ; true.
только закидывает все результаты в список.

Добавлено через 2 минуты
Цитата Сообщение от vibor Посмотреть сообщение
Для Delphi есть компонент, который есть на сайте AMZI Prolog.
Компонент компонентом Реально была настроена среда в выходом на работающее приложение?
0
0 / 0 / 0
Регистрация: 24.02.2016
Сообщений: 20
17.01.2019, 05:00  [ТС]
Да, согласен. Сейчас столкнулся с проблемой разрядности, а может и не её. Пока разбираться надо.
А есть ли связь SWI-Prolog с другими языками?
0
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
17.01.2019, 10:21
Цитата Сообщение от vibor Посмотреть сообщение
А есть ли связь SWI-Prolog с другими языками?
SWI-Prolog's features
А какой язык надо? Там все через Си, с вытекающими последствиями.
Изучайте сайт, там все очень неплохо структурировано и добротный поиск.

Для Delphi можно глянуть для примера
https://github.com/GoldenSoftwareLtd/gedemin если не закрыли доступ
gsPLClient.pas
плюс PLIntf.pas и PLHeader.pas

Правда это для версии SWI-Prolog 6.6.x
Примерно, что там за тема можно глянуть
Система логического программирования на встроенном SWI‑Prolog

Если не лень, то лучше изучить документацию
12 Foreign Language Interface

Мне понравилось
Python - SWI-Prolog bridge
и
A Node.js interface to the SWI-Prolog communicating over stdio
Для Node.js через потоки ввода-вывода, т.е. реализован сам принцип, и в Си лезть не надо
0
0 / 0 / 0
Регистрация: 24.02.2016
Сообщений: 20
06.02.2019, 12:22  [ТС]
Перевёл на EZY Prolog. С ним Delphi совместим спокойно, проверено. Но есть не понятный нюанс всё по тому же коду:
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
domains
    suit_ = clubs; diamonds; spades; hearts
    price_ = integer
    pcard = card(suit_, price_)
    line = pcard*
 
predicates
    price(price_, line, line) - (i, i, o) 
    suit(suit_, line, line) - (i, i, o)
    length(line, integer) - (i, o)
    append(line, line, line) - (i, i, o)
    reverse(line, line) - (i, o)
    select(pcard, line, line) - (i, i, o)
    delete_single_element(line, pcard, line) - (i, i, o)
    min_list(line, pcard) - (i, i)
    sort(line, line) - (i, o)
    sort_reverse(line, line) - (i, o)
    joker_num(line, integer) - (i, o)
    continuity(price_, integer, line) - (i, i, o)
nondeterm   row(line, line) - (i, o)
 
clauses 
price(_,[],[]).
price(Arg,[H|T],T1):-
    arg(2,H,Ha),
    Arg \= Ha,!,
    price(Arg,T,T1).
price(Arg,[H|T],[H|T1]):-
    price(Arg,T,T1).
    
suit(Arg,[],[]).
suit(Arg,[H|T],T1):-
    arg(1,H,Ha),
    Arg \= Ha,!,
    suit(Arg,T,T1).
suit(Arg,[H|T],[H|T1]):-
    suit(Arg,T,T1).     
 
length([], 0).
length([H|T], N):-
    length(T, M),
    N = M+1.
    
append([],L,L).
append([X|L1],L2,[X|L3]):-
    append(L1,L2,L3).
    
reverse([],[]).
reverse([X|L1],L2):-
    reverse(L1,L3),
    append(L3,[X],L2).
 
select(Elem, [Elem|Tail], Tail).
select(Elem, [Head|Tail], [Head|ResultTail]):-
    select(Elem, Tail, ResultTail). 
 
delete_single_element(List, Element, ListWithoutElement):-
    select(Element, List, ListWithoutElement), !.
 
min_list([MinElem], MinElem):-!.
min_list([Head|Tail], MinElem):-
    min_list(Tail, TailMinElem),
    TailMinElem < Head, !, MinElem = TailMinElem;
    MinElem = Head.
 
sort(List, SortedList):-
    sort(List, [], SortedList).
sort([], SortedList, SortedList):-!.
sort(UnSortedPart, SortedPart, SortedList):-
    min_list(UnSortedPart, MinElement),
    delete_single_element(UnSortedPart, MinElement, UnSortedTail),
    sort(UnSortedTail, [MinElement|SortedPart], SortedList).
 
sort_reverse([],[]).
sort_reverse(L,M):-
    sort(L,L1),
    reverse(L1,M).
    
joker_num([],0).
joker_num([H|T],N):-
    arg(1,H,K),
    K=joker,
    joker_num(T,N1),
    N is N1 + 1;
    arg(1,H,K),
    K \= joker,
    joker_num(T,N).
 
continuity(_, _,[]).
continuity(K, N, [H|T]):-
    arg(2, H, X),
    K\=X,
    N>=X-K,
    continuity(K, N, [H|T]).
        
    
row([H|T],T1):-
    arg(1,H,Arg),
    suit(Arg,[H|T],TRow),
    length(TRow,N),
    N>=3,
    sort_reverse(TRow,T1);
    arg(2,H,Arg),
    price(Arg,[H|T],T1),
    length(T1,N),
    N>=3.
    
 
    
goal
    findall(L, row([c(c,1), c(c,2), c(c,3), c(c,4), c(c,5), c(h,1), c(d,1), c(h,2), c(h,3)], L), LL), write(LL), nl.
Выводит ответ:

rogram Executed:
[[c(c,1),c(c,2),c(c,3),c(c,4),c(c,5)],[c(c,1),c(h,1),c(d,1)]]
1 Solution(s)

Почему не выводится: [[c(c,1),c(c,2),c(c,3),c(c,4),c(c,5)],[c(c,1),c(h,1),c(d,1)],[c(h,1),c(h,2), c(h,3)]] ?
0
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
06.02.2019, 15:01
Цитата Сообщение от vibor Посмотреть сообщение
Почему не выводится
findall тут ни при чем, он и так не выводит
Prolog
1
2
3
?- row([c(c,1), c(c,2), c(c,3), c(c,4), c(c,5), c(h,1), c(d,1), c(h,2), c(h,3)], L), write(L), nl, fail ; true.
[c(c,1),c(c,2),c(c,3),c(c,4),c(c,5)]
[c(c,1),c(h,1),c(d,1)]
Добавлено через 10 минут
vibor, мне трудно вам помочь, потому что я очень плохо въезжаю, какой алгоритм тут реализован, зачем лезть в этот arg, это специфический метауровневый предикат, наверняка там все проще реализуется.
То, что это игра в карты мало что проясняет, можете текстом написать...
0
0 / 0 / 0
Регистрация: 24.02.2016
Сообщений: 20
07.02.2019, 12:40  [ТС]
Суть такова, раздаётся по десять карт. Следующая карта после раздачи кладётся рядом с оставшейся колоды. Как и в любой карточной игре нужно остаться без карт. Необходимо выложить карты следующим образом. Есть два варианта либо по масти, либо по стоимости. Выкладывать нужно по рядам, в каждом ряду не менее трёх карт. Ряды строятся следующим образом, например
по-масти: clubs, 1; clubs, 2; clubs, 3 и т.д., но без пропусков. Пропуск допустим только если есть жокер, тогда он кладётся вместо недостающей карты и в последствии его можно обменять на карту которой он объявлен. Причём если он например объявлен clubs, 4, то ни игрок, ни другие игроки не могут создать ряд с участием clubs, 4;
по-стоимости clubs, 8; diamonds, 8; spades, 8. Понятно, что в таком ряду не может быть больше 4 карт, но и не менее 3.
Ряды можно выкладывать если сумма стоимости всех карт не менее 33. Туз равен 1, остальные своей стоимости, Валет, Дама, Король -11, 12, 13 соответственно. Пока нет возможности выложить ряды нужно собирать следующим образом: либо из колоды, либо ту карту которую видно. Причем ход начинается с того, что нужно взять карту. После этого если можно, то выкладываете ряды и завершается после отдачи одной карты, которая кладётся рядом с колодой. Либо сверху на неё, либо вместо неё, если вы её перед этим забрали. После того, как вы выложили ряды, но ещё карты остались, то можно подкладывать карты в чужие ряды или обменивать жокера, если имеете его эквивалент. При постройке ряда по-стоимости наличие жокера объявляется создателем ряда. Если кто-то остался без карт, а у вас остались карты считается общая стоимость оставшихся карт на руках (ряды при этом не учитываются), при наличии жокера она удваивается. Чем меньше сумма тем соответственно лучше.
Вот, вроде бы, все правила.
0
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
07.02.2019, 17:03
Цитата Сообщение от vibor Посмотреть сообщение
Суть такова
А что за игра? Где-то можно ее увидеть?
Но сходу, - тут точно не надо начинать с алгоритма подбора...
Все как обычно, сначала описание входной спецификации, т.е. колода карт с определенным состояние каждой карты, структура должна учитывать все возможные ньансы, в колоде, у игрока, в каком ряду, для джокера чем он объявлен (структура единая, просто доп. параметр для джокера, кот. у других будет пуст ил что карту обменяли на джокера, хотя я бы все сделал отдельно).
В структуре называть это все по-человечески clubs, diamonds, spades... joker, ace... короче как есть (не жадничайте)
Пролог-программу может не так просто писать, но очень хорошо читать, если все называть нормально, ну насколько это можно... Потом и отладка будет проще, а отладки будет море )) И бросьте Вы пока эту затею с Delphi, сначала сделайте прототип на SWI-Prrolog, пусть и в текстовом режиме, мой Вам совет...

Добавлено через 43 минуты
Вот пример прототипа для крестики-нолики (пять-в-ряд максимум)
xo_game
Только запускайте в хроме или лисе, с оперой периодически swish не дружит
Потом все это было реализовано, ну, почти на Delphi...
Надо будет, я Вам скину и уже конечную реализацию в графике (ну почти) плюс небольшую презентацию без особых пояснений, только пишите в личку, а то порежет форум...

Добавлено через 11 минут
И да, крестики-нолики, это все лишь учебный пример (многое там не очень оптимизировано, именно в учебных целях), не надо там дербанить меня, что мол играют не супер, зато без дерева решений, только оценочная функция и эвристики...
0
0 / 0 / 0
Регистрация: 24.02.2016
Сообщений: 20
09.02.2019, 06:58  [ТС]
Нет этой игры наверное нет, поэтому и решил её реализовать. Это была наша семейная игра. Пришла она от бабушки. Кто её научил не знаю.
Я пишу игру на Delphi. А на Prolog меня заинтересовала обработка списков. Я как раз только и думал функцию построения рядов реализовать на Prolog.
0
2 / 2 / 0
Регистрация: 23.06.2021
Сообщений: 6
24.06.2021, 02:48
Всем привет.
Выложил EZY PROLOG на сеть - ezy-prolog com
Исходники выложил на GITHUB spenkov/ezy-prolog
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.06.2021, 02:48
Помогаю со студенческими работами здесь

Проход по списку без цикла
Добро всем :senor: у меня в Image1 загружаются фотографии с определенной папки, названия файлов (фотографий) я занес в StringList а...

Рекурсивный проход по списку символов
Здравствуйте. Прошу помочь с решением задачи (Common Lisp) на рекурсию. Задача: рекурсивно пройти по списку, который является списком...

Определить количество самых дешевых книг, используя 1 проход по списку
В списке хранится информация о стоимости каждой из 60 книг. Определить количество самых дешевых книг, используя 1 проход по списку. ...

Цикл foreach. Почему не осуществляется полный проход?
Почему не осуществляется полный проход по циклу в комменте? For работает как положено. Решил первый раз юзнуть цикл обхода по массиву. ...

Как реализовать проход по структурам с помощью макросов va_list, va_arg?
Подскажите пожалуйста, как можно реализовать проход по структурам с помощью макросов va_list, va_arg.. в функции с переменным числом...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru