无法运行简单的Prolog程序

无法运行简单的Prolog程序,prolog,logic,Prolog,Logic,我试图找出这个程序的输出结果: p(X):-p(Y). p(a). p(b). p(c). and goal ?-p(Z) 所以我试着在在线解释器中输入: p(X):-p(Y). p(a). p(b). p(c). ?-p(Z). 但是什么也没发生。问题在哪里 我对Prolog非常陌生。您的谓词p具有无限递归:pX:-pY。如果p对变量Y为真,则p对变量X为真。因此,它将根据相同的规则检查pY,如果p对另一个变量为真,则pY为真,以此类推。它永远不会停止。这就是为什么你什么都看不到,解释器

我试图找出这个程序的输出结果:

p(X):-p(Y). p(a). p(b). p(c). and goal ?-p(Z) 
所以我试着在在线解释器中输入:

p(X):-p(Y). p(a). p(b). p(c).
?-p(Z).
但是什么也没发生。问题在哪里


我对Prolog非常陌生。

您的谓词p具有无限递归:pX:-pY。如果p对变量Y为真,则p对变量X为真。因此,它将根据相同的规则检查pY,如果p对另一个变量为真,则pY为真,以此类推。它永远不会停止。这就是为什么你什么都看不到,解释器正在计算一个无限查询,它甚至不会产生堆栈溢出,因为在这种情况下,它将被优化,因为它是尾部递归的。@Fatalize谢谢,所以我尝试了这个:pX:-qY。qX:-pY。宾夕法尼亚州。个人电脑。还有一个目标?-pZ。这是一样的。它也应该循环吗?是的,它应该循环。现在你说p对于一个变量是真的,如果q对于另一个变量是真的,那么q对于一个变量是真的,如果p对于另一个变量是真的。这种递归仍然没有结束。总的来说,我不明白你想在这里完成什么。你根本不需要一个pX规则。有了这三个事实就足够了。当你问pZ时,它会通过其中的三个,一次一个,自行完成。不需要为这种情况定义规则。