关于prolog中的规则。 。

时间:2011-03-13 09:26:15

标签: prolog

在我的课程中,我有一些规则,如:

tellme(X) :- knows(X).
tellme(friends1(X)) :-  tellme(X).
tellme(friends2(X)) :-  tellme(X).
tellme(friends3(X)) :-  tellme(X).
.
.
.
tellme(friends25(X)) :- tellme(X).

现在这个friends1,friends2,friends3 .....依赖于N这是一个变量。这里,例如我的N的值是25.所以这可以写一个规则来生成这些规则直到N或者我必须手动写这些规则N次。欢迎任何建议或解决方案。非常感谢你的关注。

2 个答案:

答案 0 :(得分:2)

term expansion的帮助下,您可以使用universal operator在大多数现代Prolog环境中生成任何类型和数量的代码。以下示例适用于SWI:

term_expansion(gen_tellme(N), Terms) :-
    findall((tellme(F) :- tellme(X)),
            (between(1, N, I), atom_concat(friend, I, Fi), F =.. [Fi, X]),
            Terms).

gen_tellme(25). % generates 25 copies of the tellme clause.

也就是说,将信息嵌入谓词名称,即朋友号码,通常不是一个好的设计。为什么不使用friend(N, X)重写代码,其中N是数字?

答案 1 :(得分:1)

您可以使用二元仿函数friends(N,X)取得一些成功,而不是每N一个仿函数。您可能希望更改tellmeknows以获取两个参数。 (knows(X)对我没有直接的意义,所以我并不完全得到你所追求的东西。)

如果由于某种原因,这不是你想要的,你可以用(未经测试的

之类的东西制作一个新的仿函数
friends_functor(N, Functor) :-
    number(N),
    atom_concat(friend, N, Functor).

然后使用assertaassertz。我真的不明白你为什么要这样做。