【问题标题】:Prolog - Reading through a listProlog - 阅读列表
【发布时间】:2021-04-11 22:35:27
【问题描述】:

对于我课堂上的一个问题,我无法弄清楚如何阅读 Prolog 中的数字列表。这个想法是一个名为 contains_big 的谓词将读取给定数字的列表,如果该列表中的数字超过 100,则返回“true”,否则返回 false。

contains_big([40, 692, 2, 800, 7]). = true
contains_big([2, 4, 6]).            = false

这在prolog中如何实现?

【问题讨论】:

    标签: list prolog


    【解决方案1】:

    在之前的练习中,我们有谓词classify/2

    % classify(+N, ?Classification)
    
    classify(N, small)   :- must_be(number,N), N < 50, !.
    classify(N, medium)  :- must_be(number,N), N >= 50, N =< 100, !.
    classify(N, big)     :- must_be(number,N), N > 100.
    

    现在您只需将该谓词应用于列表中的每个元素,实际上就是为该列表中的每个 N 执行查询 classify(N,big) 的析取。

    这是一个简单的方法:我们对归纳定义进行编码......

    • 如果N 很大,则以N 开头的非空列表[N|_] 包含一个大元素(并且我们不需要查看列表的其余部分,并且Prolog 不会尝试下一个子句添加!)。
    • 如果More 是包含大元素的列表,则以任何内容开头并以More 继续(可能是也可能不是空列表)的非空列表[_|More] 包含大元素。
    contains_big([N|_])    :- classify(N, big),!.  
    contains_big([_|More]) :- contains_big(More).
    

    就是这样,真的。

    所以:

    ?- contains_big([]).
    false.
    
    ?- contains_big([1,2,3]).
    false.
    
    ?- contains_big([1,200,3]).
    true.
    
    ?- contains_big([200,200,200]).
    true.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2016-08-18
      • 2013-04-14
      • 1970-01-01
      相关资源
      最近更新 更多