1

Задача

  1. Описать на Прологе базу знаний «Правители России», содержащую следующие факты:

    • Ярослав Мудрый правил с 1019 по 1054 годы,
    • Изяслав первый правил с 1054 по 1077 годы,
    • Всеволод первый правил с 1078 по 1093 годы,
    • Святополк Второй правил с 1092 по 1112 годы,
    • Владимир Мономах правил с 1113 по 1125 годы,
    • Мстислав Великий правил с 1125 по 1132 годы.
  2. Добавить к базе знаний «Правители России» правило, определяющее понятие «Великий князь в году Y», которое определяло бы имя правителя России в произвольном году Y.
  3. Добавить к базе знаний «Правители России» правило «Правили с года X по год Y», позволяющее вывести всех, кто правил Россией в период с года X до года Y включительно.
  4. Сформировать цели:
    • Кто правил Россией с 1050 по 1080 годы?
    • Кто был Великим князем в 1092 году?

Решение

predicates
  nondeterm pravil(string,integer,integer) /*name,beginn,end*/
  nondeterm pravitel(string,integer) /*name,year*/

clauses
  pravil(yaroslavmudryiy,1019,1054).
  pravil(izyaslavpervyiy,1054,1077).
  pravil(vsevolodpervyiy,1078,1093).
  pravil(svyatopolkvtoroy,1092,1112).
  pravil(vladimirmonomah,1113,1125).
  pravil(mstislavvelikiy,1125,1132).

  pravitel(X,Y):-pravil(X,A,B),Y>=A,Y=<B. 

goal
  pravitel(Y,1092), write(Y), nl.

Помогите разобраться, в чем ошибка в коде на Прологе (использую Visual Prolog v 5.2)?

E;Test_Goal, pos: 398, 409 Syntax error

Dmitriy Simushev
  • 17,999
  • 5
  • 49
  • 85
Gadget
  • 135

2 Answers2

2

Вот, что у меня запустилось:

predicates
  nondeterm pravil(string,integer,integer) /*name,beginning,ending*/
  nondeterm pravitel(string,integer) /*name,year*/
  nondeterm praviteli(string,integer,integer)/*name,year,year*/
clauses
%Facts
  /* #1 Baza znanyi "Praviteli" */
  pravil(yaroslav_mudryiy,1019,1054).
  pravil(izyaslav_pervyiy,1054,1077).
  pravil(vsevolod_pervyiy,1078,1093).
  pravil(svyatopolk_vtoroy,1092,1112).
  pravil(vladimir_monomah,1113,1125).
  pravil(mstislav_velikiy,1125,1132).
%Rules
  /* #2 Velikiy knyaz v godu Y*/
  pravitel(X,Y):-pravil(X,A,B),Y>=A,Y<=B. 
  /* #3 Praviteli Rossii s goda X po god Y*/
  praviteli(P,X,Y):-pravil(P,A,B) , X<=A, X<=B,Y>=A, Y<=B. 
  praviteli(P,X,Y):-pravil(P,A,B) , X<=A, X<=B,Y>=A, Y>=B. 
  praviteli(P,X,Y):-pravil(P,A,B) , X>=A , Y>=B.
goal
/* #1 Kto pravil Rossiey s 1050 po 1080?*/
 praviteli(X,1050,1080), write(X), nl,

/* #2 Kto byil velikim knyazem v 1092 godu?*/ 
 pravitel(Y,1092), write(Y), nl.
Gadget
  • 135
  • добавь описание, что именно поменялось, по сравнению с кодом в вопросе – Grundy Nov 23 '16 at 14:07
-1

Вроде вполне работает:

http://ideone.com/Yvh21k

pravil(yaroslavmudryiy,1019,1054).
pravil(izyaslavpervyiy,1054,1077).
pravil(vsevolodpervyiy,1078,1093).
pravil(svyatopolkvtoroy,1092,1112).
pravil(vladimirmonomah,1113,1125).
pravil(mstislavvelikiy,1125,1132).

pravitel(X,Y) :- pravil(X,A,B),Y>=A,Y=<B. 

solve(Y) :-
 pravitel(X,Y),
 write(X),
 nl,
 fail.
solve(1092).
Qwertiy
  • 123,725
  • В Visual Prolog v 5.2 выдает на это следующую ошибку: "E;Test_Goal, pos: 1, 3 Illegal keyword" – Gadget Nov 14 '16 at 17:25
  • @Gadget, на ideone нет visual prolog'а. – Qwertiy Nov 14 '16 at 17:26
  • @Qwertiy, ну а зачем тогда давать не вполне правильные ответ? – Dmitriy Simushev Nov 14 '16 at 17:36
  • @DmitriySimushev, а где в вопросе сказано, какой пролог нужен? Какой нашёл, на том и дал. – Qwertiy Nov 14 '16 at 17:39
  • @Gadget впредь пишите такие вещи прямо в вопрос. –  Nov 14 '16 at 18:22
  • Буду писать теперь сразу ) – Gadget Nov 14 '16 at 18:30
  • Мб кто-то знает, что не нравится Visual Prolog в коде из вопроса? Мне очень нужно в этом разобраться! Вроде бы же всё логично в нём, должен запускаться, но не хочет. Выдает такую ошибку: "E;Test_Goal, pos: 398, 409 Syntax error" – Gadget Nov 14 '16 at 18:35
  • @Qwertiy, а ты перечитай вопрос. Там четко сказано, какой пролог используется. – Dmitriy Simushev Nov 15 '16 at 11:53
  • @DmitriySimushev, тобой 18 минут назад ;) – Qwertiy Nov 15 '16 at 12:12
  • @Qwertiy, да. А за 19 часов до этого ТС ровно тоже написал(а) тебе в комментарии выше. – Dmitriy Simushev Nov 15 '16 at 12:31
  • @DmitriySimushev, в комментарии к уже готовому ответу. – Qwertiy Nov 15 '16 at 13:22