![](/img/trans.png)
[英]Some doubts about how Prolog automatically convert DCG grammars int a set of rules
[英]About rules in 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次。 欢迎任何建议或解决方案。 非常感谢您的关注。
在通用运算符的帮助下,您可以使用术语扩展在大多数现代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
是数字?
对于二元仿函数friends(N,X)
而不是每N
个仿函数friends(N,X)
您可能会取得一些成功。 您可能想要更改tellme
并knows
可以使用两个参数。 ( knows(X)
对我没有直接的意义,所以我不完全得到你所追求的东西。)
如果由于某种原因,这不是你想要的,你可以创建一个类似( 未经测试 )的新仿函数
friends_functor(N, Functor) :-
number(N),
atom_concat(friend, N, Functor).
然后使用asserta
或assertz
。 不过,我真的不明白你为什么要这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.