Могут ли факты иметь подфакты в JESS?

У меня есть более 150 предметов, и каждый предмет имеет следующую информацию, которую я хочу поместить в свои дефекты.

> Subject: CS222 
> Pre-requisite: CS111
> Units: 4 
> Priority-lvl: 3
> Semester-offered: 2 
> Class: A
>        Schedule: 9:00am - 10:00am (Mon & Wed)
>        Slots Available: 30 
> Class: B
>        Schedule: 9:00am - 10:00am (Tue - Thurs)
>        Slots Available: 26 
> Class: C
>        Schedule: 12:00nn - 01:30pm (Mon - Wed)
>        Slots Available: 10

Я знаю, как писать дефакты, но проблема в том, что у меня есть две информации для каждого класса (которые явно становятся субфактами), и я не знаю, как преобразовать эту информацию в дефакты.

Я знаю, что могу сделать 4 дефекта с такой информацией, как показано ниже, но я не нахожу код эффективным. Есть ли другой способ деффектировать информацию выше?

(Deffacts subject
  (subject-information 
             (name CS222)
             (identifier 1)
             (pre-requisite CS111)
             (priority-lvl 3)
             (units 4)
             (semester-offered 2)))

(Deffacts Ident
   (ident-class
              (identifier 1)
              (class A)
              (schedule 0900-1000MW)
              (stud-avail 30)))

(Deffacts Ident
   (ident-class
              (identifier 1)
              (class B)
              (schedule 0900-1000TTH)
              (stud-avail 26)))

(Deffacts Ident
   (ident-class
              (identifier 1)
              (class C)
              (schedule 1200-0130MW)
              (stud-avail 10)))

person Miao Ren Lei    schedule 04.04.2016    source источник
comment
Не добавляйте тег shell к своим вопросам.   -  person laune    schedule 04.04.2016
comment
Я добавлял это, потому что думал, что JESS — это сама оболочка.   -  person Miao Ren Lei    schedule 05.04.2016


Ответы (1)


Если вы беспокоитесь о потреблении памяти: 150 предметов и несколько занятий для каждого не вызовут исключения OutOfMemory.

Если вас беспокоит "эффективность" с точки зрения времени выполнения, я не могу сказать - это зависит от правил доступа к этим фактам. Лучше использовать два разных шаблона deftemplate или сжать их в один, зависит от того, что вы хотите сделать в правилах доступа к данным. Обычно лучше избегать списков как свойств и придерживаться реляционной модели, то есть того, что у вас есть.

«Идентификатор» слота не отображается в необработанных данных. Я полагаю, вы ввели его для того, чтобы соотнести классовые факты с субъектным фактом. Вместо этого может быть предпочтительнее использовать имя субъекта.

person laune    schedule 04.04.2016
comment
Думаю, я просто последую вашему примеру и вместо этого удалю идентификатор, поэтому мне не понадобятся 4 дефекта. Спасибо! - person Miao Ren Lei; 05.04.2016
comment
Этого я не рекомендовал - у вас все равно останется 4 факта. И (по крайней мере, не зная правил обработки) я не, повторяю: не предлагаю сводить все это в один большой кусок данных (используя мультислоты). - person laune; 05.04.2016
comment
Нет, мэм, я имел в виду, что удалю идентификатор и вместо него буду использовать имя субъекта. Это все равно оставило бы меня с 3 фактами. - person Miao Ren Lei; 05.04.2016
comment
Я также не рекомендовал трижды дублировать предметные данные, сохраняя их вместе с каждым классом. - person laune; 05.04.2016