我只是想知道我怎麼會做出一個事實,如序言事實和變量
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).
我只是想知道我怎麼會做出一個事實,如序言事實和變量
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).
你在你的例子寫了什麼是好的。您可以使用任何聲明爲中綴二元運算符的分隔符進行配對。這包括/
,+
,,
,-
等..然後,您可以模式匹配對這種方式感謝統一:
test :-
family(X, [Title/Speed|_]),
time_needed(Title, Speed).
這裏我只是模式匹配的第一個元素,但是你可以看到這個想法。
雖然,請注意,通常使用-
代替/
來分隔對。尤其是,如果使用SWI,則pairs
庫使用Key-Value
語法。
您需要聲明列表的元素。請注意,這樣你就失去了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中被內聯。但是,圖書館謂詞隱藏在語法簡單背後的一些奇怪的行爲...去更簡單的遞歸循環。
我如何使用這個列表中的所有成員? (?) '測試: - \t家庭(_,[標題/速度| ES]), \t人(標題,速度), 測試(_,ES).' – user1204349 2012-04-12 23:59:46