这学期学习了prolog的入门知识,以下是一些对于prolog的递归思考。
思考一个程序,想要写一个判断2的幂的程序,谓词twopower/2,
twopower(0,1).
twopower(X,Y):- X =\= 0,X1 is X-1,Y1 is Y/2,twopower(X1,Y1).
这个prediacate的第一个argument是幂,第二个的参数是结果,比如
twopower(3,8),会得到答案true,注意里面的运行逻辑和顺序不可以调换,一旦调换会导致argument not sufficiently initialized的报错,由此引出一个问题如果想要运行query
?-twopower(3,X)
会发生什么,这时一定会报错,想一下prolog的运行逻辑,在尝试模式匹配3,X的时候,由于第一人跳规则不符合,会进入第二条规则,在进行
twiopower(3,X):-X =\= 0 ,运行成功,接着X1 is 3-1, 成功,然后Y1 is Y/2 由于Y1和Y都没有初始化因此会报错,因此首先想到的是调换位置
twopower(X,Y):- X =\= 0,X1 is X-1,Y1 is Y/2,twopower(X1,Y1).替换为
twopower(X,Y):- X =\= 0,X1 is X-1,twopower(X1,Y1),Y1 is Y/2.这样依然存在问题,我们得到Y1,但Y时未知的变量,在谓词is种应该将已知数放在右侧,未知数放在左侧,所以正确的顺序应该是
twopower(X,Y):- X =\= 0,X1 is X-1,twopower(X1,Y1),Y is Y1*2.
这样就可以无论是正向判断还是逆向求解都正常运行。