distinct/1
- это совершенно новый предикат. Это имеет значение только в том случае, если дополнительная оценка важна либо из-за бесконечных данных, либо потому, что (по какой-то непонятной причине) точный порядок ответов имеет значение. Хорошо, и, возможно, также потому, что есть много избыточных ответов, и место для их хранения было бы запрещено, но тогда хорошая реализация setof / 3 могла бы также использовать подобную технику. В вашем случае у вас есть только база данных конечного числа фактов.
С 1982 года 1 , предикат classi c для вашей цели равен setof/3
.
* 1008. * Вы не дали
минимальный воспроизводимый пример . Так что мне нужно сделать предположение. В любом случае, доверяйте
prolog-toplevel для печати.
city_part(City, CPart) :-
setof(t, city_part0(City, CPart), _).
city_part0(City, part(Part, Name, Color, Num, X)) :-
proj(Project, _A1, City),
sppj(_A2, Part, Project, _A3),
part(Part, Name, Color, Num, X).
Вы можете избежать промежуточного предиката, но тогда количественное определение переменной станет громоздким. Я уже дал этим переменным имена A1, A2, A3
. Эти плюс Project
являются только внутренними переменными .
city_part(City, CPart) :-
setof(t, A1^A2^A3^Project^
( CPart = part(Part, Name, Color, Num, X),
proj(Project, A1, City),
sppj(A2, Part, Project, A3),
part(Part, Name, Color, Num, X)
), _).