【问题标题】:Prolog - Exercise on facts and listsProlog - 练习事实和列表
【发布时间】:2012-01-05 17:51:35
【问题描述】:

问题是我需要编写一个能够查询数据库中产品的谓词,以便它返回一个列表,其中包含其价格降低的产品名称(由“状态”指示。

domains
    state =  reduced ; normal
    element = string
    list = element*
database
    producte (string, integer, state)
predicates
    nondeterm reduced(list)
clauses 
   % ---> producte( description , price , state )
    producte("Enciam",2,reduced). 
producte("Peix",5,normal).
producte("Llet",1,reduced). 
producte("Formatge",5,normal).
    %unique case
    reduced([D]):-
         producte(D,_,reduced).
    %general case
    reduced([D|L]) :- 
         producte(D,_, reduced),retract(producte(D,_,reduced)),reduced(L).
Goal
    reduced(List).

我很感激。 现在,它给了我三种不同的解决方案。我怎么能强迫谓词给我一个解决方案?事实上,最后一个?

【问题讨论】:

    标签: database prolog fact visual-prolog


    【解决方案1】:

    由于我不使用visual-prolog,所以我只是提出一些我found in the doc的东西。

    reduced(List) :-
        List = [ Price || producte(_, Price, reduced) ].
    

    【讨论】:

    • 对不起,我没有关注你。我很感激你的兴趣。我该怎么处理你写的那一行。
    • 实际上就是这样。您是否至少尝试过运行它? >
    • 好吧,不,因为'我正在使用 Visual Prolog,它不允许这种结构。虽然我已经编辑了代码,现在给出了 3 种可能的解决方案。我只想要最后一个,因为它很好。你会怎么做才能强迫它给出最后找到的解决方案?提前致谢
    • 好吧,我从发布的链接中获取了这个结构,该链接是 Visual Prolog 文档的链接。如果那没有帮助,我会停在那里,因为我不使用 Visual Prolog。祝你好运!
    【解决方案2】:

    当列表中的第一个产品没有减少时怎么办——你没有这种情况的规则。

    【讨论】:

    • 当然:如果第一个元素没有减少,那么结果应该就是你通过减少其余元素得到的结果。但是现在你有一个新问题:如果 LAST 元素没有减少怎么办?
    • 我已经编辑了代码。现在它给了我3个解决方案。好的是最后一个。你将如何强制程序只提供最后一个?
    • 写一个谓词来处理这种情况:列表是一个单一的、未减少的元素。 (提示:它应该类似于你的独特案例,它处理了最后一个被减少的项目。)
    • 请注意,您的解决方案不是“返回”任何东西,而是消除某些产品减少的事实。通常的做法是使用 reduce 有 2 个参数:您感兴趣的项目列表,以及删除了缩减项目的列表(不改变允许您计算列表的事实)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多