Eu tenho esses modelos,
(deftemplate classroom
(slot classroom_number (type INTEGER))
(multislot students (type SYMBOL))
)
(deftemplate students_to_classroom_lookup
(multislot students (type SYMBOL))
)
e esses fatos que representam salas de aula e alunos pertencentes a essa sala de aula.
(deffacts classrooms
(classroom (classroom_number 1) (students Paul Lucy Peter Sebastian))
(classroom (classroom_number 2) (students Peter Paul Lucy Sebastian Arthur))
(classroom (classroom_number 3) (students Paul Lucy Peter))
(classroom (classroom_number 4) (students Lucy Peter Paul))
)
Então eu tenho esse fato, que segue o template "students_to_classroom_lookup" e é digitado pelo teclado enquanto o programa está rodando.
(students_to_classroom_lookup (students Paul Peter Sebastian Lucy))
Quero encontrar o número da sala de aula que tem exatamente esses e somente esses alunos.
Observe que o conteúdo de,
(students_to_classroom_lookup (students Paul Peter Sebastian Lucy))
é baseado na entrada do usuário, em outra execução do programa o conteúdo de "alunos" poderia ser Paul Sebastian Lucy Peter ou apenas Lucy Peter Paul.
Eu tentei esta regra:
(defrule match_classroom_and_students
(classroom (classroom_number ?number) (students $?students))
(students_to_classroom_lookup (students $?students_lookup&:(subsetp $?students $?students_lookup)))
=>
(printout t "Classroom number " ?number crlf)
)
Saída:
Classroom number 1
Classroom number 3
Classroom number 4
Resultado esperado:
Classroom number 1
Agradeço toda ajuda.
Para uma correspondência exata dos conjuntos A e B, A deve ser um subconjunto de B e B deve ser um subconjunto de A: