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

Ошибка: "Syntax error in clause body, predicate call expected"

08.10.2016, 20:02. Просмотров 2837. Ответов 10
Метки нет (Все метки)


Начал только изучать, выкидывает ошибку "Syntax error in clause body, predicate call expected". В чем проблема?
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
DOMAINS
list = integer*
PREDICATES
perevod(integer,integer,list)
add(integer,list,list)
CLAUSES
add(E,[],[E]).
add(E,[H|T],[H|T]):-
add(E,T,T).
 
perevod(1,_,[1]).
perevod(0,_,[0]).
 
perevod(X,Y,[H|T]):-
C = X/Y,
D = X mod Y,
perevod(D,Y,List),
add(C,List,[H|T]).
 
GOAL
write("Vedite chislo: "),readint(X),nl,
write("Vedite osnovanie sistemi scchislenia: "),readint(Y),nl,
perevod(X,Y,[H|T]),nl,
write("Answer is : "), [H|T].
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2016, 20:02
Ответы с готовыми решениями:

Можете подсказать в чём ошибка "error c161 : Syntax error: '.' is expected"?
Грымзик, Здравствуйте. Можете подсказать в чём ошибка "error c161 : Syntax error: '.' is...

Ошибка: "Strange predicate as a head in clause 0"
Strange predicate ,_2),_3(_1,_4)),conc(_4,,_2)] as a head in clause 0. что эт за ошибка???

Написал калькулятор с менюшкой. Выдает ошибку "clause for the same predicate should be group"
Пишет ошибку 415 clause for the same predicate should be group domains s=integer ...

Ошибка "project1.lpr(35,0) Fatal: Syntax error, "BEGIN" expected but "end of file" found"
type tarray= array of integer; var a:tarray; m,s,k:integer; procedure...

10
Фрилансер
3680 / 2051 / 565
Регистрация: 31.05.2009
Сообщений: 6,684
08.10.2016, 23:23 2
Скорее всего из-за того, что не тот Пролог.
Это код для Turbo Prolog или Visual Prolog 5.2
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51
09.10.2016, 00:02  [ТС] 3
Black Fregat, да это visual prolog, я на нем и компилю
0
Фрилансер
3680 / 2051 / 565
Регистрация: 31.05.2009
Сообщений: 6,684
09.10.2016, 00:19 4
Лучший ответ Сообщение было отмечено farta как решение

Решение

Что-то странное у Вас в конце написано.. 1) Скобка не на месте. 2) Зачем там список в виде [H|T]?
Напишите так:
Prolog
1
2
perevod(X,Y,L),nl,
write("Answer is : ", L).
1
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51
09.10.2016, 00:27  [ТС] 5
Black Fregat, заработало, трудноват в освоении язык, большое спасибо!
0
Фрилансер
3680 / 2051 / 565
Регистрация: 31.05.2009
Сообщений: 6,684
09.10.2016, 00:27 6
Дополнительные замечания.
1) У Вас C и D перепутаны местами: результат деления нужно переводиить дальше, а остаток добавлять к списку
2) Целое деление не так пишется, по аналогии с mod: X div Y
3) Ваш вариант всегда будет выдавать 0 в начале числа
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51
09.10.2016, 00:38  [ТС] 7
Black Fregat, как раз искал ошибку, спасибо! Также исправил данный фрагмент
Prolog
1
2
perevod(1,_,[1]):- !.
perevod(0,_,[0]):- !.
Если же просто оставить так:
Prolog
1
2
perevod(1,_,[1]).
perevod(0,_,[0]).
То программа зацикливается, правильно ли я понимаю, что "!" является признаком конца рекурсии?
0
Фрилансер
3680 / 2051 / 565
Регистрация: 31.05.2009
Сообщений: 6,684
09.10.2016, 05:47 8
Цитата Сообщение от farta Посмотреть сообщение
правильно ли я понимаю, что "!" является признаком конца рекурсии?
Не совсем. Отсечение (восклицательный знак) даёт команду отменить все существующие развилки.
То есть в нашем случае при срабатывании одного из этих двух правил пролог-машина не станет проверять остальные.
Иначе ничто не мешает выполнить и третье.

Если бы в рекурсивном правиле стоял явный запрет, отсечение бы не понадобилось, а выход из рекурсии всё равно произошёл бы. Например, так:
Prolog
1
2
3
4
5
perevod(1,_,[1]).
perevod(0,_,[0]).
perevod(X,Y,[H|T]) :-
  X > 1, % Это сравнение запретит лишний вход в рекурсию
  ...
Нечто подобное неявным образом происходит при работе со списками:
Prolog
1
2
3
4
p([], ...).      % Пустой список явно обрабатывается первым правилом
p([H|T], ...) :- % Второе правило сработает только для НЕПУСТОГО списка,
                 % ведь пустой список не подходит под шаблон [_|_]  
                 % у пустого списка нет головы и хвоста
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51
09.10.2016, 11:06  [ТС] 9
Black Fregat,
То есть при таком варианте в хвост списка просто заносится какое то значение, но при этом правило продолжает проверяться?
Prolog
1
2
perevod(1,_,[1]).
perevod(0,_,[0]).
0
Фрилансер
3680 / 2051 / 565
Регистрация: 31.05.2009
Сообщений: 6,684
09.10.2016, 15:15 10
Нет, на одной итерации это не сказывается. Но образуется развилка, и при первом же откате будет бесконечная рекурсия.
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 51
09.10.2016, 22:08  [ТС] 11
Black Fregat, спасибо, буду разбираться дальше!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2016, 22:08

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

Ошибка "Fatal: Syntax error, "BEGIN" expected but "END" found"
Ввожу unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil,...

Ошибка "Syntax error, "BEGIN" expected but "end of file" found"
В чём заключается ошибка в 73 строке под названием "Syntax error, "BEGIN" expected but "end of...

Ошибка при компиляции "Syntax error "Begin" expected but ";" found"
При компиляции выдаёт ошибку "Syntax error "Begin" expected but ";" found" в блоке Procedure...

Ошибка "Fatal: Syntax error, ";" expected but "." found"
звучит задание: создай программу, в которой можно преподнести введенное пользователем число к...


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

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

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