我只是想知道如何制作像
这样的事实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).
答案 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中'内联'。但是这个库谓词隐藏了语法简单性的一些奇怪的行为......使用更简单的递归循环。