Ошибка при компиляции кода на Prolog в онлайн компиляторе

Рейтинг: 0Ответов: 1Опубликовано: 14.01.2023

Код:

predicates  
nondeterm object3(list,list,string)
clauses

Object3(I,O,sentence):-
 Object3(I,R,noun_group),
 Object3(R,O,verb_group).

Object3(I,O,verb_group):-
 Object3(I,R,verb),
 Object3(R,O,noun_group).
        
Object3(I,O,noun_group):-
 Object3(I,R,adj),
 Object3(R,O,noun).
            
Object3(I,O,adj):-
 Object3(I,O,adjective).
        
Object3(I,I,adj).
        
Object3([профессиональный|R],R,adjective).
Object3([любительский|R],R,adjective).
Object3([начальный|R],R,adjective).
Object3([детский|R],R,adjective).       
Object3([футбол|R],R,noun).
Object3([хоккей|R],R,noun).  
Object3([бейсбол|R],R,noun).
Object3([регби|R],R,noun).  
Object3([баскетбол|R],R,noun).  
Object3([волейбол|R],R,noun).   
Object3([играть|R],R,verb). 
Object3([увлекаться|R],R,verb).
Object3([смотреть|R],R,verb). 
Object3([заниматься|R],R,verb).

Выдает такие ошибки

main.pro:2:1: syntax error: . or operator expected after expression
main.pro:8:8: syntax error: . or operator expected after expression
main.pro:12:8: syntax error: . or operator expected after expression
main.pro:16:8: syntax error: . or operator expected after expression
main.pro:19:8: syntax error: . or operator expected after expression
main.pro:21:8: syntax error: . or operator expected after expression
main.pro:22:8: syntax error: . or operator expected after expression
main.pro:23:8: syntax error: . or operator expected after expression
main.pro:24:8: syntax error: . or operator expected after expression
main.pro:26:8: syntax error: . or operator expected after expression
main.pro:27:8: syntax error: . or operator expected after expression
main.pro:28:8: syntax error: . or operator expected after expression
main.pro:29:8: syntax error: . or operator expected after expression
main.pro:30:8: syntax error: . or operator expected after expression
main.pro:31:8: syntax error: . or operator expected after expression
main.pro:33:8: syntax error: . or operator expected after expression
main.pro:34:8: syntax error: . or operator expected after expression
main.pro:35:8: syntax error: . or operator expected after expression
main.pro:36:8: syntax error: . or operator expected after expression
    19 error(s)
compilation failed

Ответы

▲ 0Принят
  1. Убираете первые три строки. Насколько я знаю, они специфичны только для Turbo Prolog и Visual Prolog, в других диалектах не нужны.
  2. Заменяете Object3 на object3. Обычно с большой буквы записываются только переменные. В Turbo Prolog и Visual Prolog может быть по-другому, но я с ними не работал, не могу сказать, работало бы там. Но вообще у вас даже в predicates object3 с маленькой буквы записан.
  3. Оберните все атомы на русском в одинарные кавычки (или перепишите их латиницей).

Итого получается такой код:

object3(I,O,sentence):-
 object3(I,R,noun_group),
 object3(R,O,verb_group).

object3(I,O,verb_group):-
 object3(I,R,verb),
 object3(R,O,noun_group).
        
object3(I,O,noun_group):-
 object3(I,R,adj),
 object3(R,O,noun).
            
object3(I,O,adj):-
 object3(I,O,adjective).
        
object3(I,I,adj).
        
object3(['профессиональный'|R],R,adjective).
object3(['любительский'|R],R,adjective).
object3(['начальный'|R],R,adjective).
object3(['детский'|R],R,adjective).       
object3(['футбол'|R],R,noun).
object3(['хоккей'|R],R,noun).  
object3(['бейсбол'|R],R,noun).
object3(['регби'|R],R,noun).  
object3(['баскетбол'|R],R,noun).  
object3(['волейбол'|R],R,noun).   
object3(['играть'|R],R,verb). 
object3(['увлекаться'|R],R,verb).
object3(['смотреть'|R],R,verb). 
object3(['заниматься'|R],R,verb).

Ошибок он не выдает, но пишет, что не задана начальная цель (https://onecompiler.com/prolog/3yv37b4fm):

Warning: no initial goal executed
   use a directive :- initialization(Goal)
   or remove the link option --no-top-level (or --min-bips or --min-size)

Т.е. упрощенно говоря, нужно через :- initialization(что-то) запустить какой-то запрос. Какие запросы можно задавать к вашему коду так сходу не понять. В минимальном виде выполнение запроса должно выглядеть так:

something(a, b).

:- initialization(main).
main :- something(a, X), write(X).

Вывод:

b