У меня есть база знаний в файле Prolog (.pl) с использованием SWI-Prolog.Подсчитать факты в Прологе
reserve(bus(2389),place(4),datetravel([12,2,1999]),
info([88032454321,robert,downe])).
reserve(bus(2389),place(33),datetravel([12,2,1999]),
info([88032454321,alberto,perez])).
reserve(bus(2389),place(16),datetravel([12,2,1999]),
info([88032454321,angel,clark])).
reserve(bus(4566),place(17),datetravel([22,3,2005]),
info([88032454321,don,self])).
reserve(bus(2389),place(22),datetravel([12,2,1999]),
info([88032454321,singmud,dante])).
Я реализовал правило, которое вы дали мне несколько параметров, подсчитывают количество событий, которые соответствуют этим ограничениям, но не работает для меня, как я могу?
Правило
test(N,D,M,Y,P):-
reserve(bus(N),place(4),datetravel([D,M,Y]),
info([88032454321,robert,downe])),
test(N,D,M,Y,P+1).
Вопрос
?- test(2389,12,2,1999,P).
Учитывая мой вопрос правило должен возвращать число 4.
Вы не можете передать 'P + 1' и ожидать, что Prolog проверит выражение. Это не работает. он буквально передаст термин «+» (P, 1) 'в предикат. И у вас нет базового аргумента для' test', который обрабатывает тривиальный случай. С одним рекурсивным предикатом, когда вы ожидаете, что это закончится? И затем при каждом вызове 'test', Prolog будет придерживаться того же факта в соответствии с вашим правилом (поскольку новый запрос предиката начинается в начале для сопоставления фактов/правил по запросу), поэтому они не будут правильно подсчитывать их – lurker
Простейшим способом подсчета будет использование 'findall', а затем длина результата:' findall (_, reserve (bus (_), place (4), datetravel ([_, _, _]), info ([88032454321, robert, downe])), L), length (L, N) .', а затем 'N' - счет. – lurker
Я полностью понимаю, что я должен остановить случай, рекурсия такова. Я не люблю использовать предопределенную функцию findAll, я делаю это сам. Я искал реализацию findall в сети, но не могу ее найти, никаких идей? Я делаю это сам, но не начинаю. – user1813375