gpt4 book ai didi

prolog - 使用削减来提高效率

转载 作者:行者123 更新时间:2023-12-04 06:26:49 25 4
gpt4 key购买 nike

如果我有以下知识库,我如何向 parent_of 术语添加一个剪切,以便如果 X 已经被确定为父亲,prolog 将不会尝试“检查”X 是否也是母亲?

father_of(max,john).
father_of(max,james).
father_of(max,gabe).
mother_of(june,john).
mother_of(june,james).

parent_of(X,Y) :- father_of(X,Y).
parent_of(X,Y) :- mother_of(X,Y).

例如,我想要:

parent_of(max,Y) 为:Y=john, Y=james, Y=gabe

parent_of(june,Y) 为:Y=john, Y=james

对于第一个,我什至不希望 prolog 尝试检查 max 是否是 mother_of,因为已经确定他是 father_of。

我已经尝试过很多组合,包括:

parent_of(X,Y) :- father_of(X,Y),!.  <-- fixes an X and Y and thus will list only Y=john
parent_of(X,Y) :- !,father_of(X,Y). <-- works for parent_of(max,Y) but not parent_of(jane)

这可能吗?

最佳答案

进行此类优化非常棘手。 Prolog 在没有任何优化的情况下在这些问题上表现相当好。

但总的来说:不能简单的把切入到程序中,需要提前进行各种测试。我怀疑这些测试很容易比您打算消除的开销更昂贵。这是一个尝试。老实说,我感觉不太好,因为你宁愿先学习纯 Prolog。

因此我们假设没有解决方案:?- father_of(P,_), mother_of(P,_)。

parent_of(F, C) :-   (  atom(F), \+ \+ father_of(F, _) -> !   ;  true   ),   father_of(F, C).parent_of(M, C) :-   mother_of(M, C).

这真的更好吗?也许,也许不是。

但无论如何,您已经明白了重要的一点:巧妙的优化需要大量的测试。我相信上面是正确的,但我什至不确定这会更快。毕竟,现在有两次查找 father_of/2,而不是一次查找 father_of/2 和一次查找 mother_of/2。天真的版本可能会更快......

关于prolog - 使用削减来提高效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13408215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com