Ограничить печать фактов пролога три раза? - PullRequest
1 голос
/ 17 октября 2011

Скажем, у меня есть 10 фактов path(X) в базе данных.

Как мне ограничить печать первых 3 из базы данных?

Я пытался использовать рекурсивную технику, но, похоже,что он будет объединяться только с первым.

Все помогают по достоинству.

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Есть две возможности. Оба должны использовать дополнительные логические свойства Пролога.

(1) Вы собираете все факты в списке, а затем распечатываете первые N элементов этого списка, используя рекурсию. Этот подход очевиден, но он может быть неэффективным, когда имеется много фактов (например, тысяч), и только несколько из них будут записаны (например, 3).

print1(N) :- 
    findall(path(X), path(X), List),
    print1(List, N).

print1([], N) :- !.
print1([H|T], N) :- 
    writeln(H),
    N1 is N - 1, N1 > 0,
    print1(T, N1).

?- print1(3).

(2) Вы можете использовать выдвижной счетчик и неисправную петлю. Этот подход менее изящен, чем первый, но будет более эффективным в случае, когда много фактов и только немногие из них написаны.

:- dynamic count/1.
print2(N) :-
    assert(count(N)), !,
    path(X), writeln(path(X)),
    retract(count(K)),
    K1 is K - 1,
    (K1 > 0 -> assert(count(K1)); true, !), 
    fail.

?- print2(3).

Добавление : печать первых N "самых маленьких" фактов в порядке возрастания:

print_sorted(N) :-
    findall(path(X), path(X), List),
    msort(List, SortedList),
    print1(SortedList, N). 
0 голосов
/ 18 октября 2011

Если вы уверены, что существует как минимум 3 факта, и вы не против, если все Решения созданы:

three_results(A,B,C) :- findall(X,path(X),[A,B,C|_]).

Вы также можете использовать что-то вроде:

n_results(0,A,A) :- !.
n_results(N,A,R) :- path(X), (member(X,A) -> fail; true), N1 is N - 1, n_results(N1,[X|A],R).
three_results(X) :- n_results(3,[],X).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...