2012-04-12 41 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中被内联。但是,图书馆谓词隐藏在语法简单背后的一些奇怪的行为...去更简单的递归循环。