我只是想知道我怎么会做出一个事实,如序言事实和变量
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