您好,感谢您抽出宝贵时间阅读此问题。我有以下问题:
给定一个返回大于 X 的数字个数的列表 示例:greater(4,[1,2,3,4,5,6],N) 结果。N= 2
may(0,[],0):-!, fail.
may(N,[N],1).
may(N,[H|Q],X):-H>N,may(Q,N,X),X is X+1.
问题是 PROLOG 只返回False而不是X的值。
我希望你能向我解释我做错了什么,提前感谢你的帮助。
您好,感谢您抽出宝贵时间阅读此问题。我有以下问题:
给定一个返回大于 X 的数字个数的列表 示例:greater(4,[1,2,3,4,5,6],N) 结果。N= 2
may(0,[],0):-!, fail.
may(N,[N],1).
may(N,[H|Q],X):-H>N,may(Q,N,X),X is X+1.
问题是 PROLOG 只返回False而不是X的值。
我希望你能向我解释我做错了什么,提前感谢你的帮助。
当您在第三行规则中调用 may(Q,N,X) 时出现第一个错误,然后您尝试使用 X 踩到 X 为 X+1。Prolog中不允许这样的赋值,因为已经赋值的“变量”不能修改。第二个返回 false 因为当 may(N,[H|Q],X):-H>N,may(Q,N,X),X 为 X+1。compare 1>4 返回 false 并且因为它不能进入其他规则(因为一个是空列表,另一个如果它只有一个元素)抛出 false 并且回溯返回 false。在 prolog 中使用了什么,对我来说,了解它的工作原理是编写跟踪非常有用。在提示符下查看程序如何运行以及使用 nodebug。退出跟踪模式。您的程序将如下所示:
使用下划线是为了不给出 Singleton 警告。它的功能是不同的,但是为了不让你混淆,我只告诉你前面提到的,你会看到我在第二行创建了一个变量 X1 可以保存满足条件的值的数量更大,然后在它们小于 N 时调用下面的那个,因为否则,当它遇到一个较小的时,回溯将开始,它将切断递归,抛出错误。我希望你能理解并回答我的任何问题。