prolog事实和变量

时间:2012-04-12 01:06:28

标签: 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).

2 个答案:

答案 0 :(得分:2)

你在你的例子中写的很好。您可以使用声明为中缀二进制运算符的任何分隔符进行配对。其中包括/+,-等等...由于统一,您可以通过这种方式模式匹配对:

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

这里我只对第一个元素进行了模式匹配,但你可以看到这个想法。

但请注意,通常使用-代替/来分隔对。特别是,如果您使用SWI,pairs库将使用Key-Value语法。

答案 1 :(得分: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中'内联'。但是这个库谓词隐藏了语法简单性的一些奇怪的行为......使用更简单的递归循环。