繁体   English   中英

关于prolog中的规则。 。

[英]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)您可能会取得一些成功。 您可能想要更改tellmeknows可以使用两个参数。 knows(X)对我没有直接的意义,所以我不完全得到你所追求的东西。)

如果由于某种原因,这不是你想要的,你可以创建一个类似( 未经测试 )的新仿函数

friends_functor(N, Functor) :-
    number(N),
    atom_concat(friend, N, Functor).

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM