Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion Prolog中祖父母的定义,有任何Prolog程序员愿意帮助澄清这一点吗?_Recursion_Prolog_Family Tree - Fatal编程技术网

Recursion Prolog中祖父母的定义,有任何Prolog程序员愿意帮助澄清这一点吗?

Recursion Prolog中祖父母的定义,有任何Prolog程序员愿意帮助澄清这一点吗?,recursion,prolog,family-tree,Recursion,Prolog,Family Tree,祖父母(X,Y):-父母(X,母亲(Y)) 通常,祖父母会被定义为父母(X,Z),父母(Z,Y)……但对我来说,作为X的父母Y的父母,这看起来更自然,正如我上面所定义的(对不起,我无法更好地解释我自己) 我的问题是:这个定义是否仍然有效,如果不是,原因是什么?我能从语法错误的序言中恢复您的意图的最好方法是: grandparent(X, Y) :- parent(X, Y), mother(Y). 但这仅仅是事实的一半:X是祖父母,但Y不是孙子,只是一个带着自己孩子的女婴。为了让祖父母(X,Y

祖父母(X,Y):-父母(X,母亲(Y))

通常,祖父母会被定义为父母(X,Z),父母(Z,Y)……但对我来说,作为X的父母Y的父母,这看起来更自然,正如我上面所定义的(对不起,我无法更好地解释我自己)
我的问题是:这个定义是否仍然有效,如果不是,原因是什么?

我能从语法错误的序言中恢复您的意图的最好方法是:

grandparent(X, Y) :- parent(X, Y), mother(Y).
但这仅仅是事实的一半:X是祖父母,但Y不是孙子,只是一个带着自己孩子的女婴。为了让祖父母(X,Y)得到预期的定义,我们必须在逻辑上把某些东西与中间一代统一起来。这就是传统概念中的
Z
。如果您定义了
mother/2
而不是
mother/1
,那么
mother(mother,Child)
意味着
mother
Child
的母亲,那么您基本上就有了
parent/2
的同义词,并且您的解决方案与正常的定义没有什么不同,但如果孩子是男性,它将无法产生一半的解决方案。所以说真的,它只对了1/4


请注意,Prolog没有其他编程语言意义上的隐式返回值,因此类似于
parent(X,mother(Y))
的表示法几乎肯定不是您的意思。

老实说,这只是完整代码的一部分,除此之外,还有父辈祖父母,被定义为parent(X,father(Y))父母被定义为父亲(X,Y);母亲(X,Y)我只是拿一个代码示例作为例子,这样你就不必通读你不需要的代码行了。除此之外,我还有一个关于男性和女性的定义。我开始认为我应该粘贴整个代码…一个最小的工作示例(或者最小的非工作示例,如果问题是bug)通常是最好的策略。除此之外,整个代码减去运行该示例所不需要的部分也很好。