gpt4 book ai didi

prolog - 如何检查名称是否在谓词中由其相似术语识别的列表中?

转载 作者:行者123 更新时间:2023-12-02 08:14:31 25 4
gpt4 key购买 nike

假设,我有一个序言谓词,例如:

name(music,[jazz,blues,classical]).

我想要的是检查 say jazz 的成员资格,如果在音乐中则返回 true?

到目前为止,我是这样做的:

ismember(X,Y):-imember(X,name(Y,Z)),write(Z).
imember(X,[_|Tail]):-imember(X,Tail).
imember(X,[X|_]).

但它不起作用。

?- ismember(jazz,music).
false.

而且它不是在编写 write(Z) 部分。

最佳答案

以下片段的可见部分存在错误。不仅你的程序失败了,下面的概括也失败了:

:- op(950, fy, *).*(_).ismember(X,Y):-   imember(_/*X*/,name(_/*Y*/,Z)).imember(X,[_|Tail]):-   * imember(X,Tail).imember(X,[_/*X*/|_]).?- ismember(X, Y).

通过用 _ 替换一些变量,并用 * 删除一个目标,获得了泛化。它尽可能地概括。也就是说,任何进一步的概括都会使目标成功。在(纯粹的、单调的)Prolog 中有一个很好的属性:

如果泛化失败(针对特定查询),那么原始程序也会失败(针对同一查询)。

这是一个很好的属性,它以某种方式在通用片段和原始程序之间建立因果关系。如果要消除错误,则必须更改通用程序中的某些内容。或者相反:如果您所做的更改仍然允许获得泛化,那么您还没有修复错误。

考虑到这一点,在搜索这样的片段时,无需“理解”实际程序。只要可能,随便猜测和概括就足够了。

现在,如果我们看一下这个概括,请注意ismember/2 的参数被完全忽略了!

关于prolog - 如何检查名称是否在谓词中由其相似术语识别的列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43168269/

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