Prolog递归初学思考

这学期学习了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.

这样就可以无论是正向判断还是逆向求解都正常运行。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值