2011-12-14 84 views
2

我在prolog中有一個數據庫,我想要做的就是通過它的元素enuamrate並逐一打印。如何才能做到這一點?如何在prolog中打印所有數據庫事實

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 2011-12-15 10:54:18

+0

可能重複在Prolog中的謂詞](http://stackoverflow.com/questions/846145/getting-all-the-solutions-to-a-predicate-in-prolog) – Kaarel 2011-12-15 10:54:45

回答

4

您也可能會考慮使用forall/2斷言:

print:- 
forall(fact(P), writeln(P)). 
2

嗯,你幾乎有:

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

首先,我們得到了一個事實,並打印。

fail;true. 

然後,我們回溯(通過失敗),直到沒有解決方案離開。爲了避免返回false,我們添加與真的分離。

請注意,您可以進行不同的,如:

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

但是如果你去這條道路,寧願@gusbro解決方案,它的更好!

+0

這也很完美,謝謝你的幫助! – tomsky 2011-12-14 21:40:40