关于prolog中的规则。

关于prolog中的规则。,prolog,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). 现在这个朋友1,朋友2,朋友3。。。。。依赖于N,N是一个变量。这里,例如,my N的值是25。那么,是否可以编写一个规则来生

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

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

现在这个朋友1,朋友2,朋友3。。。。。依赖于N,N是一个变量。这里,例如,my N的值是25。那么,是否可以编写一个规则来生成这些规则,直到N次,或者我必须手动编写这些规则N次。欢迎提出任何建议或解决方案。非常感谢您的关注。

您可能会成功地使用二进制函子
friends(N,X)
,而不是每个
N
使用一个函子。您可能需要将
tellme
knows
更改为同时接受两个参数。(
知道(X)
对我没有直接意义,所以我不完全明白你的意思。)

如果,出于某种原因,这不是您想要的,您可以使用类似(未测试的)的内容创建一个新的函子


然后使用
asserta
assertz
。不过,我真的不明白您为什么要这样做。

您可以在大多数现代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
是数字?

但它给了我这个错误:错误:顶层:未定义的过程:gen_tellme/1(DWIM无法纠正目标)@anilonwebs:您需要在同一个文件中同时查询两个谓词。第一个定义术语扩展规则,第二个使用它。“gen_tellme()”已展开,但它不会成为真正的谓词。不要在提示中尝试此操作。把它放在一个文件里。看看基本情况缺少的第一件事,即我的问题部分的第一条规则。所以我把它添加到一个文件中<代码>告诉我(X):-knows(X)。,
knows(anil)。
使用您的定义规则。但是当我查询
tellme(friends1(anil))
时,它会给出错误的结果。我把所有代码都写在一个文件中。@anilowebs:这是一种类型:我写的是“friend”而不是“friends”。
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.