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

Проблемы с циклом foreach

29.09.2019, 17:30. Показов 1950. Ответов 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
implement main
    open core, console
 
class facts
    i : unsigned := 0.
 
class predicates
    deleteItemsWithEvenIndices: (integer* List) anyflow.
 
clauses
    deleteItemsWithEvenIndices(List) :-
        Copy = List,
        foreach Item in Copy do
            if i mod 2 = 0 then
                List = list::remove(List, Item)
            end if,
            i := i + 1
        end foreach.
 
    run() :-
        init(),
        write("\tВведите список в квадратных скобках с запятыми"), nl,nl,
        write("Список -> "),
        List = read(), nl,
 
        write("\tСписок, в котором удалены элементы с четными индексами:"),
        deleteItemsWithEvenIndices(List),
        write(List),
        nl.
 
end implement main
 
goal
    console::runUtf8(main::run).
Помогите пожалуйста, уже пробовал менять код по-разному, результата ноль. Выводит следующую ошибку:
Prolog
1
error c635 : The body of 'foreach' must be procedure
при этом подчеркивает строку
Prolog
1
List = list::remove(List, Item)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.09.2019, 17:30
Ответы с готовыми решениями:

Работа с циклом foreach
Есть два скрипта. Первый вешается на квадраты в сцене и добавляет в один массив сам квадрат, в другой цифру. После этого второй скрипт,...

Ошибка с циклом foreach
функция function allusers() { connect_db(); $query = "SELECT `login` FROM `reg_users`"; $result = mysql_query($query); $rows...

Запись в файл циклом foreach
<div class="col-md-2"> <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu" style="display: block; position: relative;...

4
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
29.09.2019, 22:59
Цитата Сообщение от антон лимонов Посмотреть сообщение
The body of 'foreach' must be procedure
Почитайте для начала, что такое процедура: Режимы детерминизма предикатов в Visual Prolog

Цитата Сообщение от антон лимонов Посмотреть сообщение
при этом подчеркивает строку List = list::remove(List, Item)
Предикат list::remove() determ - он упадёт на пустом списке. Его надо замкнуть до процедуры дополнительной веткой, например:
Prolog
1
2
3
4
(
    List = list::remove(List, Item);
    succeed
)
Добавлено через 2 минуты
В данном конкретном случае скобки можно, вероятно, опустить, их роль возьмёт на себя обрамление foreach ... end foreach
Но проверить прямо сейчас не могу, нет под рукой Visual Prolog
1
1 / 1 / 0
Регистрация: 22.11.2018
Сообщений: 13
29.09.2019, 23:24  [ТС]
Спасибо за ответ, надо будет попробовать. Вообще пришел к решению путем объявления списка в фактах:

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
implement main
    open core, console
 
class facts
    i : unsigned := 0.
    mylist: integer* := [].
 
class predicates
    deleteItemsWithEvenIndices: (integer* List).
 
clauses
    deleteItemsWithEvenIndices(List) :-
        mylist := List,
        foreach Item in List do
            if i mod 2 = 0 then
                mylist := list::remove(mylist, Item)
            end if,
            i := i + 1
        end foreach.
 
    run() :-
        init(), nl,
        write("\tВведите список в квадратных скобках с запятыми"), nl,nl,
        write("Список >> "), List = read(),
 
        deleteItemsWithEvenIndices(List),
        write("Список, в котором удалены элементы с четными индексами:"),
        write(mylist), nl.
 
end implement main
 
goal
    console::runUtf8(main::run).
0
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
29.09.2019, 23:57
Если этот вариант работает, видимо, я что-то напутал.
Проверю, как доберусь до Visual Prolog

Добавлено через 6 минут
Точно, невнимательно посмотрел..
Тело цикла будет падать не из-за режима детерменизма предиката list::remove(), а из-за неуспеха сопоставления.
Вы делаете типичную ошибку - пытаетесь переопределить значение ранее связанной переменной. В Прологе так нельзя. Переопределять факт базы можно, а переменную - нельзя

Добавлено через 7 минут
А обязательно использовать цикл?
Есть более простые варианты, например коллектор списков:
Prolog
1
NewList = [X || X in List, i := i + 1, i mod 2 > 0]
1
1 / 1 / 0
Регистрация: 22.11.2018
Сообщений: 13
30.09.2019, 16:20  [ТС]
Да, я недавно начал изучать prolog, еще многого не знаю. Спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.09.2019, 16:20
Помогаю со студенческими работами здесь

Вывод двумерного массива циклом foreach
Почему двумерный массив через цикл foreach выводится на экран в одну строку? Как сделать через foreach в виде таблицы? (чтобы не...

Ошибка при работе с циклом foreach
Здравствуйте, мне нужно перебрать массив при помощи цикла foreach, я работаю локально на машине с openserver. При выполнении кода...

Добавление картинки в меню построенном циклом foreach
Друзья, я хочу на своем сайте в около каждого пункта меню вывести иконку. Меню выводится с помощью цикла foreach. Речь идет об этом...

Вывести список записей из файла циклом foreach
Здравствуйте, имеется класс: require_once __DIR__.'/shablon.php'; class view { protected $autor; protected $comment; ...

Заполнить массив циклом for и вывести через foreach
Создать целочисленный массив n=6 на m=3 и заполнить при помощи цикла for значениями начиная от 1 до 63. Вывести на экран, созданный...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 23.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru