在我的课程中,我有一些规则,如:
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次。欢迎任何建议或解决方案。非常感谢你的关注。
答案 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
一个仿函数。您可能希望更改tellme
和knows
以获取两个参数。 (knows(X)
对我没有直接的意义,所以我并不完全得到你所追求的东西。)
如果由于某种原因,这不是你想要的,你可以用(未经测试的)
之类的东西制作一个新的仿函数friends_functor(N, Functor) :-
number(N),
atom_concat(friend, N, Functor).
然后使用asserta
或assertz
。我真的不明白你为什么要这样做。