如何在序言中返回所有小于或等于输入值的事实

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在序言中返回所有小于或等于输入值的事实相关的知识,希望对你有一定的参考价值。

我是Prolog的新手,正在为这个问题而苦苦挣扎。我有作者,书籍和价格的清单:

wrote(applying_uml,pauline_wilcox).
wrote(applying_uml,pooley_rob).
wrote(artificial_intelligence,boden_margaret).
wrote(artificial_vision,cantoni_virginio).
wrote(artificial_vision,levialdi_stefano).
wrote(bioinformatics,critchlow_terence).
price(applying_uml,72).
price(artificial_intelligence,92).
price(artificial_vision,48).
price(bioinformatics,57).

我正在尝试写一个谓词,给定输入价格,它将返回所有作者的书籍和价格,直到输入价格为止。到目前为止,我有这个:

specs(BK1, Aut1, P1) :- price(BK1, P1), wrote(BK1, Aut1).

P1是输入的价格,而BK1和AUT1输出具有该价格及其作者的书籍。但是我想不出如何使它还返回价格低于投入价格的书籍及其作者。例如,如果我输入57作为P1,它应该返回人工视觉和生物信息学,如下所示:

48 pounds
BK1 = artificial_vision,
Aut1 = cantoni_virginio ;
48 pounds
BK1 = artificial_vision,
Aut1 = levialdi_stefano ;
57 pounds
BK1 = bioinformatics,
Aut1 = critchlow_terence.

我已经尝试弄乱第二个价格变量P2并使它<= P1,然后检查price(BK1,P2),但是它一直失败。我想知道是否可能需要使用递归,但是我不知道如何实现它。我不知道该从哪里去,希望有人能提供帮助。谢谢。

答案

您不必使用递归。您创建另一个变量的想法确实是一个很好的解决方案。您只需将其添加为前提条件中的另一个条件:

specs(BK1, Aut1, P1) :- price(BK1, B), B =< P1, wrote(BK1, Aut1).

在这种情况下,它将首先获得所有列为B的价格,但将验证该价格是否小于或等于P1值。以您的代码为例,您将获得如下输出:

?- specs(BK1,Aut1,57).

BK1 = artificial_vision
Aut1 = cantoni_virginio  

BK1 = artificial_vision
Aut1 = levialdi_stefano  

BK1 = bioinformatics
Aut1 = critchlow_terence  
no
另一答案

停止考试作弊,您将为所有人毁了它。我们已经报告了你。

以上是关于如何在序言中返回所有小于或等于输入值的事实的主要内容,如果未能解决你的问题,请参考以下文章

算法总结之 未排序数组中累加和小于或等于给定值的最长子数组长度

Haskell:返回与其前任的绝对差等于或小于某个值的列表项

MongoDB JAVA API Filters

获取总和小于或等于数据集中值的记录

第一个元素之间的差异小于或等于第二个元素的最小值的对的数量[关闭]

删除python中小于某个值的行