как я могу распечатать все факты базы данных в прологе - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть база данных в прологе, все, что я хочу сделать, - это пронаблюдать через ее элемент и печатать по одному Как это можно сделать?

fact(is(mike,asthmatic)).
fact(has(andy,highPressure)).
fact(is(mike,smoker)).

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

print:- 
  retract(factA(P)),
    write(factA(P)),nl,
    fail.
  print.

Ответы [ 2 ]

4 голосов
/ 14 декабря 2011

Вы также можете использовать предикат forall/2:

print:-
 forall(fact(P), writeln(P)).
2 голосов
/ 14 декабря 2011

Ну, вы были почти там:

print :-
    fact(A),
    writeln(A),

Сначала мы получаем факт и распечатываем его.

    fail;true.

Затем мы возвращаемся (через неудачу), пока не будет найдено решениеоставил.Чтобы избежать возврата false, мы добавляем дизъюнкцию с true.

Обратите внимание, что вы можете действовать по-другому, например:

print2 :-
    findall(Fact, fact(Fact), Facts),
    maplist(writeln, Facts).

Но если вы пойдете по этому пути, предпочтите решение @gusbro, лучше!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...