Два вопроса в решениях, обозначенных Шевлясковичем и мбратчем. В первом случае 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.
Это подсчитывает, сколько раз используется один модуль 'cse'. Я думаю, что @ user2334012 хочет знать, сколько уникальных модулей существует. Поэтому может потребоваться «setof (M, исследования (M, _), ListOfModules), length (ListOfModules, Num) .' и' Num' будет число уникальных модулей. – lurker
Это может быть. Я не уверен, что он пытается сказать, «покажите, сколько всего модулей существует» точно – Shevliaskovic
Спасибо @ Шевляскович. Спасибо, очень. Оно работает. Но я хотел спросить вас, что я новичок в этом, что решение, которое вы предоставили, - это запрос или правило – user2334012