我想學習序言,我有一個非常大的問題將我的編程知識轉換爲這種語言。我無法解決真正的新手問題。學習序言
,比如我有這個
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
,但我無法理解如何進行檢查,並打印所有數字。
我想學習序言,我有一個非常大的問題將我的編程知識轉換爲這種語言。我無法解決真正的新手問題。學習序言
,比如我有這個
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
,但我無法理解如何進行檢查,並打印所有數字。
在序言一個非常基本的概念是模式匹配
有很多教程解釋它,就像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).
is_even(N) :- 0 =:= N mod 2. all_even_number :- a(b(X)), is_even(X), writeln(X), fail. all_even_number.
謝謝,這清理了很多東西。 – 2011-05-07 12:27:32