Prolog多规则链式调用:实现more规则判断舞步forward次数更多
Prolog more规则实现方案
正确实现代码
more(X) :- count(X, ForwardCnt, BackwardCnt), greater(ForwardCnt, BackwardCnt).
如果需要先校验输入的X是合法的舞步序列,可以增加dance(X)子目标:
more(X) :- dance(X), count(X, ForwardCnt, BackwardCnt), greater(ForwardCnt, BackwardCnt).
实现逻辑说明
Prolog规则的规则体是多个子目标的合取,执行时会按顺序匹配子目标,通过参数绑定传递计算结果:
- 首先将输入的序列
X作为第一个参数传入count谓词,count执行完成后会将统计得到的forward次数绑定到ForwardCnt变量,backward次数绑定到BackwardCnt变量 - 再将绑定了值的两个计数变量作为参数传入
greater谓词,判断forward次数是否大于backward次数即可
测试验证
和你给出的预期结果完全匹配:
- 查询
?- more(backward(forward(start))).:统计得到forward和backward次数均为succ(0),greater判断不成立,返回false - 查询
?- more(forward(start)).:统计得到forward次数为succ(0),backward次数为0,greater判断成立,返回true
之前写法的问题说明
more(X):-greater(Y,Z)的问题:Y、Z是未绑定的自由变量,没有和count的统计结果关联,Prolog无法获取两个计数的实际值more(X):-greater(count(X,Y,Z))的问题:Prolog没有函数返回值的概念,谓词不能像函数一样嵌套调用作为另一个谓词的参数,所有计算结果都需要通过参数绑定的方式传递
内容的提问来源于stack exchange,提问作者krs
相关产品推荐
相关产品推荐

