2011-05-07 132 views
3

我想學習序言,我有一個非常大的問題將我的編程知識轉換爲這種語言。我無法解決真正的新手問題。學習序言

,比如我有這個

a(b(1)). 
a(b(2)). 
a(b(3)). 
a(b(4)). 
a(b(6)). 

的行使要打印(使用writeln(X))所有B(Y)如果Y是偶數。

我能找到,如果它是一個即使使用此號碼,如果我沒看錯的

a(b(X)) mod 2 =:= 0 

,但我無法理解如何進行檢查,並打印所有數字。

回答

7

在序言一個非常基本的概念是模式匹配
有很多教程解釋它,就像this一個
,你可能還需要檢查第二章的第一和休息。

的原因,我真的很喜歡序言之一是,我只是寫我想要什麼:

我想打印所有具有特定屬性的X.
讓我們先描述屬性。

X具有如果 它所屬的數據庫 屬性是偶數

has_attribute(X):- 
    belongs_db(X), 
    is_even(X). 

在數據庫X所屬如果有一個子句A(B(X))

belongs_in_db(X):- 
    a(b(X)). 

X即使2的除法的其餘部分爲0:

is_even(X):- 
    0 =:= X mod 2. 

現在我們可以問has_attribute(X),prolog會回覆,列出每個X. ,但我們希望所有的X.這樣做,我們將使用findall/3謂詞 查找所有具有我想要屬性的X並將它們放入一個名單

findall(X,has_attribute(X),List). 

現在我們已經在列表中的所有X和我們想打印出來 一個簡單的方法是隻使用writeln/1:

writeln(List) 

所以,到底:

run:- 
    findall(X,has_attribute(X),List), 
    writeln(List). 

has_attribute(X):- 
    a(b(X), 
    0 =:= X mod 2. 

另一方面,您可能需要以其他方式打印數字。 對於這一點,你應該使用recursion

如果列表是空的,我做

my_print_list([]). 

如果列表中有haed和尾我會打印第一個元素,然後尾巴:

my_print_list([Head|Tail]):- 
    writeln(Head), 
    my_print_list(Tail). 
+0

謝謝,這清理了很多東西。 – 2011-05-07 12:27:32

0
 
is_even(N) :- 
     0 =:= N mod 2. 

all_even_number :- 
     a(b(X)), 
     is_even(X), 
     writeln(X), 
     fail. 
all_even_number.