2011-12-14 3 views
2

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

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

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

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

Если вы не хотите, чтобы удалить, то просто не называют 'втягивания/1' ... – Kaarel

+0

возможный дубликат [Получение всех решений к предикату в Prolog] (http://stackoverflow.com/questions/846145/getting-all-the-solutions-to-a-predicate-in-prolog) – Kaarel

ответ

4

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

print:- 
forall(fact(P), writeln(P)). 
+0

он работал, когда я сменил этот код на: print: - forall (fact (P), (write (P), nl)). Можете ли вы сказать мне, почему writeln не работает? Является ли он зависимым от компилятора? – tomsky

+0

Хорошо, это зависит от того, доступен ли предикат 'writeln/1' для вашей реализации. Кажется, это не так! Какой пролог вы используете? – m09

+0

Новейший GNU Prolog от http://www.gprolog.org/ – tomsky

2

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

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

Во-первых, мы получаем факт и распечатать его.

fail;true. 

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

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

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

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

+0

Это также отлично работает, спасибо за вашу помощь! – tomsky

Смежные вопросы