Prolog 序言事实和变量

Prolog 序言事实和变量,prolog,puzzle,Prolog,Puzzle,我只是想知道我怎么能说出这样的事实 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,库将使用
键值
语法。

您需要断言列表的元素。请注意,这样会丢失
原始

:- 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\u family(原始)。

如果您的序言中有forall/2(或maplist/2+库(lambda)),代码可能会更紧凑:

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

i、 递归循环现在在forall/2中是“内联”的。但这个库谓词隐藏在语法简单性的背后,隐藏着一些奇怪的行为。。。使用更简单的递归循环。

我如何对列表中的所有成员使用此循环<代码>测试(?)-家庭(u,[头衔/速度])、个人(头衔,速度)、测试(u,速度)。