У меня вопрос к гуру в языке Пролог. Никак не могу понять, как в Пролог организовать следующее действие:
variants(N):- predicat(_,_),N is N + 1,fail.
хотелось бы сосчитать количество вариантов, которые находит система при вычислении predicat(_,_), которые я перебираю при помощи fail, но N у меня постоянно 0.. юзаю SWI-Prolog.. как сосчитать количество вариантов выдаваемых системой не уходя в рекурсии?
Здравствуйте, raydac, Вы писали:
R>Добрый день
R>У меня вопрос к гуру в языке Пролог. Никак не могу понять, как в Пролог организовать следующее действие:
R>variants(N):- predicat(_,_),N is N + 1,fail.
R>хотелось бы сосчитать количество вариантов, которые находит система при вычислении predicat(_,_), которые я перебираю при помощи fail, но N у меня постоянно 0.. юзаю SWI-Prolog.. как сосчитать количество вариантов выдаваемых системой не уходя в рекурсии?
Если переменная имеет конкретное значение (конкретизирована), то присвоить ей новой значение нельзя. Новое значение можно присвоить только после расконкретизации переменной, что может произойти в процессе возврата (при бектрекинге).
Предикат N is N + 1 возвращает ложь.
Мне довольно трудно сходу ответить на заданный вопрос, так как я не гуру и имею мало опыта на прологе. Поконкретней бы задачку.
Здравствуйте, raydac, Вы писали:
R>Добрый день
R>У меня вопрос к гуру в языке Пролог. Никак не могу понять, как в Пролог организовать следующее действие:
R>variants(N):- predicat(_,_),N is N + 1,fail.
R>хотелось бы сосчитать количество вариантов, которые находит система при вычислении predicat(_,_), которые я перебираю при помощи fail, но N у меня постоянно 0.. юзаю SWI-Prolog.. как сосчитать количество вариантов выдаваемых системой не уходя в рекурсии?
В SWI-Prolog есть библиотека aggregate.pl
В ней aggregate/3, который умеет count, min, max и пр.
Еще есть occurs.pl.
Там есть предикат count/2. Правда not public.
Здравствуйте, raydac, Вы писали:
R>хотелось бы сосчитать количество вариантов, которые находит система при вычислении predicat(_,_), которые я перебираю при помощи fail, но N у меня постоянно 0.. юзаю SWI-Prolog.. как сосчитать количество вариантов выдаваемых системой не уходя в рекурсии?
Для SWI-prolog:
variants(N) :- findall((X,Y), predicate(X,Y), XYs), length(XYs,N).
% или вот даже так
variants(N) :- findall(_, X^Y^predicate(X,Y), Dummies), length(Dummies,N).
Здравствуйте, Beam, Вы писали:
B>В SWI-Prolog есть библиотека aggregate.pl B>В ней aggregate/3, который умеет count, min, max и пр.
B>Еще есть occurs.pl. B>Там есть предикат count/2. Правда not public.
Оффтопик: повбивал бы авторов SWI-Prolog за мега-уникальное расширение файлов.
Или этот диалект старше перла?
Здравствуйте, Beam, Вы писали:
B>Здравствуйте, Кодт, Вы писали:
К>>Оффтопик: повбивал бы авторов SWI-Prolog за мега-уникальное расширение файлов. К>>Или этот диалект старше перла?
B>Ну, судя по wikipedia — оба где-то 1987 год. B>Perl B>SWI-Prolog
Но сам то пролог старше. А .pl — традиционное расширение для пролога с незапамятных времен.
Здравствуйте, Трурль, Вы писали:
Т>Но сам то пролог старше. А .pl — традиционное расширение для пролога с незапамятных времен.
Тогда повбивал бы авторов перла... хотя, конечно, надо повбивать авторов ДОС, в которой тип файла определяется кусочком его имени. А не сигнатурой в содержании (знаменитый юниксовый шабанг, например). Впрочем, повбивать автора ДОС каждый горазд