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).
4

2 に答える 2

2

あなたの例で書いたことは問題ありません。中置二項演算子として宣言されている任意の区切り文字とペアにすることができます。これには/+,などが含まれ-ます。統合のおかげで、次のように一致ペアをパターン化できます。

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

ここでは、最初の要素のみをパターン マッチさせましたが、そのアイデアを見ることができます。

ただし、通常はペアを区切る-代わりに使用されることに注意してください。/特に、SWI を使用する場合、pairsライブラリはKey-Value構文を使用します。

于 2012-04-12T06:49:41.893 に答える
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 + library(lambda)) がある場合、コードはよりコンパクトになる可能性があります。

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

つまり、再帰ループは forall/2 で「インライン化」されています。しかし、そのライブラリの述語は、構文の単純さの背後にいくつかの奇妙な動作を隠しています...より単純な再帰ループを使用してください。

于 2012-04-12T08:22:43.310 に答える