2012-04-12 56 views
1

我只是想知道我怎麼會做出一個事實,如序言事實和變量

family(original, [dad/1, mom/2, child/5, granny/10]). 

其中original將是家族的名稱,該列表由標題和速度。

如何從標題(如:dad/1)分隔號,所以我可以做這樣的事情:

time_needed(dad,1). 
time_needed(mom,2). 
time_needed(child,5). 
time_needed(granny,10). 

回答

2

你在你的例子寫了什麼是好的。您可以使用任何聲明爲中綴二元運算符的分隔符進行配對。這包括/+,-等..然後,您可以模式匹配對這種方式感謝統一:

test :- 
    family(X, [Title/Speed|_]), 
    time_needed(Title, Speed). 

這裏我只是模式匹配的第一個元素,但是你可以看到這個想法。

雖然,請注意,通常使用-代替/來分隔對。尤其是,如果使用SWI,則pairs庫使用Key-Value語法。

+0

我如何使用這個列表中的所有成員? (?) '測試: - \t家庭(_,[標題/速度| ES]), \t人(標題,速度), 測試(_,ES).' – user1204349 2012-04-12 23:59:46

1

您需要聲明列表的元素。請注意,這樣你就失去了original鍵。

:- dynamic time_needed/2. 
assert_family(Key) :- 
    family(Key, List), 
    assert_list(List). 

assert_list([]). 
assert_list([N/V|Es]) :- 
    assertz(time_needed(N, V)), 
    assert_list(Es). 

,你叫assert_family(original).

如果您的Prolog有FORALL/2(或MAPLIST/2 +庫(拉姆達))的代碼可能是更緊湊:

:- dynamic time_needed/2. 
assert_family(Key) :- 
    family(Key, List), 
    forall(member(N/V, List), 
     assertz(time_needed(N, V))). 

即遞歸現在循環它在forall/2中被內聯。但是,圖書館謂詞隱藏在語法簡單背後的一些奇怪的行爲...去更簡單的遞歸循環。