2013-11-19 2 views
0
student(ram,cse). 
student(kirat,com). 
student(ajay,cse). 
student(amit,cmt). 

studies(cmt,uc). 
studies(cmt,pm). 
studies(com,pm). 
studies(com,aplc). 
studies(com,ads). 
studies(cse,aplc). 
studies(cse,pm). 
studies(cse,algorithms). 
studies(cmt,pm). 

classmate(X,Y):-student(X,Y). 

Мне нужно создать правило для «Считать количество модулей во всех, например, cse, cmt и com».Создать правило для подсчета количества модулей

Когда я только что даю cse, cmt или com, тогда он покажет, сколько там модулей. Эти модули хранятся в данных фактах исследований, как я могу сделать правило для этого.

ответ

1

aggregate_all(count, studies(cse,_), Count).

4 ?- aggregate_all(count, studies(cse,_), Count). 
Count = 3. 

Он работает так же с СМТ, ком.

Как @mbratch сказал, это не покажет количество уникальных модулей, но общее их количество.

+2

Это подсчитывает, сколько раз используется один модуль 'cse'. Я думаю, что @ user2334012 хочет знать, сколько уникальных модулей существует. Поэтому может потребоваться «setof (M, исследования (M, _), ListOfModules), length (ListOfModules, Num) .' и' Num' будет число уникальных модулей. – lurker

+0

Это может быть. Я не уверен, что он пытается сказать, «покажите, сколько всего модулей существует» точно – Shevliaskovic

+0

Спасибо @ Шевляскович. Спасибо, очень. Оно работает. Но я хотел спросить вас, что я новичок в этом, что решение, которое вы предоставили, - это запрос или правило – user2334012

2

Два вопроса в решениях, обозначенных Шевлясковичем и мбратчем. В первом случае aggregate_all /3 не является стандартным предикатом, что делает это решение менее переносимым. Но использование setof/3 так, как показано не даст ожидаемых результатов из-за анонимной переменной:

?- setof(M, studies(M, _), ListOfModules), length(ListOfModules, Num). 
ListOfModules = [com], 
Num = 1 ; 
ListOfModules = [cse], 
Num = 1 ; 
ListOfModules = [com, cse], 
Num = 2 ; 
ListOfModules = [cmt, com, cse], 
Num = 3 ; 
ListOfModules = [cmt], 
Num = 1. 

Чтобы сделать эту проблему более ясно, мы можем заменить анонимную переменную по имени переменной:

?- setof(M, studies(M, A), ListOfModules), length(ListOfModules, Num). 
A = ads, 
ListOfModules = [com], 
Num = 1 ; 
A = algorithms, 
ListOfModules = [cse], 
Num = 1 ; 
A = aplc, 
ListOfModules = [com, cse], 
Num = 2 ; 
A = pm, 
ListOfModules = [cmt, com, cse], 
Num = 3 ; 
A = uc, 
ListOfModules = [cmt], 
Num = 1. 

Исправление этой проблемы очень просто. Решение состоит в том, чтобы явно квалифицировать второй аргумент studies/2 так, что мы не получим решение для каждого значения второго аргумента:

?- setof(M, A^studies(M, A), ListOfModules), length(ListOfModules, Num). 
ListOfModules = [cmt, com, cse], 
Num = 3. 
Смежные вопросы