Error syntax error operator expected prolog

Syntax error: Operator expected Prolog Решение и ответ на вопрос 2580571

programmer18

1 / 1 / 0

Регистрация: 24.11.2018

Сообщений: 54

1

06.02.2020, 20:12. Показов 9785. Ответов 8

Метки нет (Все метки)


Всем привет!
Подскажите, пожалуйста, в чем ошибка?

ругается на вторую строчку ERROR: c:/2.pl:2:1: Syntax error: Operator expected

Prolog
1
2
domains
  list = integer*

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Фрилансер

3703 / 2075 / 567

Регистрация: 31.05.2009

Сообщений: 6,683

06.02.2020, 22:39

2

Подозреваю, что Вы используете SWI-Prolog, а приведён код для Turbo или Visual.
В SWI-Prolog вообще не используется понятие домена, это версия без типизации



2



1 / 1 / 0

Регистрация: 24.11.2018

Сообщений: 54

07.02.2020, 11:13

 [ТС]

3

дада, работаю swi-prolog редактор. Понятно…получается надо убрать domains?



0



Фрилансер

3703 / 2075 / 567

Регистрация: 31.05.2009

Сообщений: 6,683

07.02.2020, 11:23

4

Надо оставить только код из clauses
И то обычно надо доводить напильником



2



programmer18

1 / 1 / 0

Регистрация: 24.11.2018

Сообщений: 54

07.02.2020, 11:37

 [ТС]

5

Вот получается код, который идет до goal.
Как мне тогда изменить и раздел predicates? подскажите, пожалуйста.

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
domains
  list = integer*
predicates
  member(integer,list)
  create(list,list)
  print(list)
clauses
  member(X, [X|_]):- !.
  member(X, [_|T]):- member(X, T).
  create([], []).
  create([H|T], [H|L]) :- member(H, T), create(T, L), not(member(H, L)).
  create([_|T], L) :- create(T, L).
  print([]) :- !.
  print([H|[]]) :- write(H).
  print([H|T]) :- write(H, ", "), print(T).

Добавлено через 5 минут
и потом list вызывается в goal.

Добавлено через 1 минуту
и что-то не еще с create в SWI-Prolog



0



Black Fregat

Фрилансер

3703 / 2075 / 567

Регистрация: 31.05.2009

Сообщений: 6,683

09.02.2020, 03:40

6

Я же написал

Цитата
Сообщение от Black Fregat
Посмотреть сообщение

Надо оставить только код из clauses
И то обычно надо доводить напильником

В данном случае «доводить напильником»:
1) выкинуть member, так как в SWI уже есть
2) разбить write на два, так как SWI не так понимает несколько параметров

Prolog
1
2
3
4
5
6
  create([], []).
  create([H|T], [H|L]) :- member(H, T), create(T, L), not(member(H, L)).
  create([_|T], L) :- create(T, L).
  print([]) :- !.
  print([H|[]]) :- write(H).
  print([H|T]) :- write(H), write(", "), print(T).

Не проверял работу.



1



programmer18

1 / 1 / 0

Регистрация: 24.11.2018

Сообщений: 54

10.02.2020, 10:30

 [ТС]

7

вот так пока получается. ругается на list, который в domains объявлялся. если list вообще убрать, программа выводит false.

его надо как-то объявлять?

Prolog
1
2
3
4
5
6
7
8
9
goal :-
  write( "список:"), nl,
  read(list, L), nl,
  append(L, RL),
  write("результат:"), nl,
  write('['),
  print(RL),
  write("]"), nl,
  read(_).



0



Фрилансер

3703 / 2075 / 567

Регистрация: 31.05.2009

Сообщений: 6,683

10.02.2020, 13:06

8

В SWI предикат read не требует указания типа:

Код

?- read(L).
|: [1,2,3].

L = [1, 2, 3].

?-

Список вводить как положено в языке — со скобочками, запятыми и точкой в конце



1



1 / 1 / 0

Регистрация: 24.11.2018

Сообщений: 54

10.02.2020, 13:20

 [ТС]

9

спасибо огромное! все учел,подправил!



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

10.02.2020, 13:20

9


0

0

Подскажите пожалуйста, почему нижеприведенный код компилируется в Visual Prolog, но при компиляции в SWI-prolog выдает ошибки:

?- ERROR: /home/dc/c0ding/prolog/l2.pl:2:0: Syntax error: Operator expected
ERROR: /home/dc/c0ding/prolog/l2.pl:5:0: Syntax error: Operator expected
ERROR: /home/dc/c0ding/prolog/l2.pl:28:0: Syntax error: Operator expected
ERROR: /home/dc/c0ding/prolog/l2.pl:94:30: Syntax error: Operator expected
ERROR: /home/dc/c0ding/prolog/l2.pl:99:1: Syntax error: Operator expected
domains
person = symbol.
 
facts
man(person)
woman(person)
father(person, person)
mother(person, person)
husband(person, person)
wife(person, person)

predicates
 
%nondeterm 
%troyurodnaya_sestra(person, person). 
 
nondeterm 
roditel(person, person). 
 
%nondeterm 
%svodniy_brat(person, person). 
 
%nondeterm 
%sestra(person, person) 
 
clauses

man(anatoly).
man(ivan). 
man(fedor). 
man(petr). 
man(pavel). 
man(boris). 
man(anton). 
man(victor). 
man(andrey). 
man(vasiliy). 
man(sergey). 
man(georgiy). 
man(mark). 
 
woman(irina). 
woman(mariya). 
woman(vera). 
woman(larisa). 
woman(anna). 
woman(julia). 
woman(marina). 
woman(nina). 
woman(elena). 
woman(lidiya). 
woman(oksana). 
woman(yelizeta). 
woman(kristina). 

father(anatoly, fedor). 
father(anatoly, anna). 
father(anatoly, petr). 
father(ivan, pavel). 
father(ivan, nina). 
father(ivan, marina). 
father(petr, anton). 
father(petr, elena). 
father(pavel, victor). 
father(pavel, lidiya). 
father(pavel, andrey). 
father(boris, vasiliy). 
father(anton, yelizeta). 
father(andrey, kristina). 
father(andrey, sergey). 
father(vasiliy, georgiy). 
father(vasiliy, mark). 

mother(irina, fedor). 
mother(irina, petr). 
mother(irina, anna). 
mother(mariya, pavel). 
mother(mariya, marina). 
mother(mariya, nina). 
mother(vera, anton). 
mother(larisa, elena). 
mother(anna, victor). 
mother(anna, lidiya). 
mother(julia, andrey). 
mother(nina, vasiliy). 
mother(elena, sergey). 
mother(lidiya, yelizeta). 
mother(oksana, kristina). 
mother(oksana, georgiy). 
mother(oksana, mark). 


roditel(parent, child) :- 
 	mother(parent, child) or 
 	father(parent, child). 


goal 
mother(vasiliy, mark) or father(vasiliy, mark).

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    >
    Может кто хорошо шарит в пролог

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    28.09.11, 18:50

      умножение x*n путем сложения

      Пробывал с консоли и в самом test.pl

      ExpandedWrap disabled

        mult(x,m) :- mult(x,m-1)+x.

        goal

        x=mult(2,5),

        write(x).

      Ни в какую ни даёт запустить, что тут не так написано ?

      Сообщение отредактировано: xpoint — 28.09.11, 18:51


      Swetlana



      Сообщ.
      #2

      ,
      29.09.11, 04:28

        рекурсивное правило есть, а граничного условия (выхода из рекурсии) нет.


        staff



        Сообщ.
        #3

        ,
        29.09.11, 04:37

          Хмм, а что за правило выхода из рекурсии ? не подскажите

          Добавлено 29.09.11, 04:40
          он не только, ругается и на эту строку

          ExpandedWrap disabled

            x=mult(2,5),

            write(x).

          Мол используются статические методы

          в этом случае даёт всё время false

          ExpandedWrap disabled

            multi(0,0).

            multi(s(X),Y,Z):- multi(X,Y,W), plus(W,Y,Z).


          Swetlana



          Сообщ.
          #4

          ,
          29.09.11, 09:21

            xpoint, если это Турбопролог, то все переменные пишутся с большой буквы, тогда у вас в правиле multi ошибка. И граничное условие другое.

            ExpandedWrap disabled

              predicates

              multi(integer,real,real)

              goal

              multi(2,5,X), write(X).

              clauses

              multi(0,X,0).

              multi(N,X,Y):-

                N1=N-1,

                multi(N1,X,Y1),

                Y=X+Y1.

            Добавлено 29.09.11, 09:29
            Наоборот x и m в параметрах multi поставила

            Добавлено 29.09.11, 09:31
            И нельзя переменной присваивать предикат

            Добавлено 29.09.11, 10:07
            Вообще предикат — логическая функция, возвращает успех/неудача. Если согласование (выполнение) предиката заканчивается неудачей, то включается механизм возврата.
            А чтобы предикат вернул какой-то результат, нужно завести для него аргумент.

            Сообщение отредактировано: Swetlana — 29.09.11, 10:07


            staff



            Сообщ.
            #5

            ,
            29.09.11, 15:47

              Хмм на swipl получаю вот такую ошибку

              ExpandedWrap disabled

                ERROR: /home/vasilij/test.pl:2:0: Syntax error: Operator expected

                ERROR: /home/vasilij/test.pl:9:0: Syntax error: Operator expected

              predicates и clauses ему не нужны, но почему-то переполняется стэк

              Добавлено 29.09.11, 15:47
              Прям как и у меня было


              Swetlana



              Сообщ.
              #6

              ,
              29.09.11, 17:19

                В Турбопрологе работает. swi не знаю


                staff



                Сообщ.
                #7

                ,
                29.09.11, 17:21

                  хмм интересно интересно, даже с учебного компьютера пробовал. А вот с факториалом задачка работает, хмм по логике должно работать, но вот что не так не пойму. Хмм что делать :(

                  Спасибо и на этом буду смотреть что не так.

                  Добавлено 29.09.11, 17:22
                  да и на gnu prolog тоже не пашет, не только на swi

                  Добавлено 29.09.11, 17:26
                  да и на turbo prolog

                  вот что пишет

                  http://img.prado.lt/?v=tprolog.png

                  Добавлено 29.09.11, 17:33
                  ха скомпилировал на turbo prolog, а вот что ему не нравится в самом прологе. Нужно будет анализировать


                  Swetlana



                  Сообщ.
                  #8

                  ,
                  29.09.11, 17:34

                    Цитата xpoint @ 29.09.11, 17:21

                    да и на turbo prolog

                    вот что пишет

                    http://img.prado.lt/?v=tprolog.png

                    Это не ошибка. Нажмите на F10.


                    staff



                    Сообщ.
                    #9

                    ,
                    29.09.11, 17:37

                      Спасибки огромное, только теперь нужно заставить работать на swi prolog. Если заставлю, покажу пример всем. Чтобы если, что и другие знали что и как :)


                      Swetlana



                      Сообщ.
                      #10

                      ,
                      29.09.11, 17:38

                        В главном меню найдите опцию «директивы компилятора» и поставьте nondeterm warnings в off.


                        staff



                        Сообщ.
                        #11

                        ,
                        05.10.11, 14:45

                          А вот и полное решение на swipl

                          ExpandedWrap disabled

                            multi(0,_,0):-!.

                            multi(N,X,Y):- N>0, N1 is N-1, multi(N1, X, Y1), Y is X+Y1.

                          Либо вот так

                          ExpandedWrap disabled

                            multi(N,X,Y):- N>0, N1 is N-1, multi(N1, X, Y1), Y is X+Y1.

                            multi(0,_,0).

                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                          0 пользователей:

                          • Предыдущая тема
                          • Prolog
                          • Следующая тема

                          Рейтинг@Mail.ru

                          [ Script execution time: 0,0347 ]   [ 15 queries used ]   [ Generated: 9.02.23, 15:26 GMT ]  

                          Понравилась статья? Поделить с друзьями:
                        • Error syntax error at or near raise
                        • Error syntax error at or near psql
                        • Error syntax error at or near procedure
                        • Error syntax error at or near parallel
                        • Error syntax error at or near or sqlstate 42601