【问题标题】:Excluding even numbers in Prolog在 Prolog 中排除偶数
【发布时间】:2021-01-06 10:05:18
【问题描述】:

让 L 是一个数字列表,并考虑以下 Prolog 定义的谓词 g(list,list) 与流模型(输入,输出):

g([],[]).
g([H|T],[H|S]):-
    g(T,S).
g([H|T],S):-
    H mod 2 =:= 0,
    g(T,S).

给出以下目标的结果:g([1,2,3],L)。证明答案。

我已经看到,当它仅在第二个分支上时结果将是 [1,2,3],而当它与排除偶数的第三个分支结合时,第二个答案是 [1,3]。这是一个很好的解释吗?

【问题讨论】:

    标签: prolog logic


    【解决方案1】:

    这个想法是运行谓词以形成一个没有偶数的列表。

    解释: 让我们从一个例子 [1,2,3] 开始,谓词取第一个 H (1) 并检查条件(\+(0 is H mod 2)),所以 1 mod 2 不为零,因此条件为真,这个 1 被推入列表.现在继续下一个 H (2),检查条件,条件失败,因为 2 mod 2 为 0,现在检查下一个谓词 2,这里条件 (0 is H mod 2) 满足但我们将 NOT 推送它进入列表。接下来是 H(3),满足条件(\+(0 is H mod 2)) 并被推入列表。然后 H ([]) 所以第一个谓词成功并且程序停止。

    exclude_even([],[]).
    exclude_even([H|T],[H|List]):-
        \+(0 is H mod 2),!,
        exclude_even(T,List).
    exclude_even([H|T],List):-
        0 is H mod 2,!,
        exclude_even(T,List).
    
    ?- exclude_even([0,1,2,3,4,5],L).
    L = [1, 3, 5]
    
    ?- exclude_even([1,2,3],L).
    L = [1, 3]
    

    【讨论】:

    • 正确,但是给出逻辑立场而不是代码的操作立场会更好:通过从列表B中过滤偶数创建的列表A 是:1) B 如果 B 为空,则列出自身 2) B 如果头部是奇数,则以 B 的其余部分为后缀,没有偶数 3) 只是 B 的其余部分如果 B 的头部是偶数,则没有偶数。然后只需证明该程序终止(感觉是肯定的,因为它是归纳定义)。确实,有一个不断减小的变体,即输入列表的长度,它只能下降到 0。
    • 是的。我只是想保持简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多