不包括Prolog中的偶数 设L为数值表,考虑谓词G(list,list)的以下Prolog定义与流模型(输入,输出):

不包括Prolog中的偶数 设L为数值表,考虑谓词G(list,list)的以下Prolog定义与流模型(输入,输出):,prolog,logic,Prolog,Logic,给出以下目标的结果:g([1,2,3],L)。证明答案的正确性 我已经看到,当它只在第二个分支上运行时,结果将是[1,2,3],当它与排除偶数的第三个分支合并时,第二个anwer是[1,3]。这是一个很好的解释吗?方法是运行谓词以形成一个没有偶数的列表 说明: 让我们从一个例子[1,2,3]开始,谓词取第一个H(1)并检查条件(\+(0是H mod 2)),因此1 mod 2不是零,因此条件为真,并且这个1被推到列表中。现在转到下一个H(2),检查条件,条件失败,因为2 mod 2是0,现在检查

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


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

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

说明: 让我们从一个例子[1,2,3]开始,谓词取第一个H(1)并检查条件
(\+(0是H mod 2))
,因此1 mod 2不是零,因此条件为真,并且这个1被推到列表中。现在转到下一个H(2),检查条件,条件失败,因为2 mod 2是0,现在检查2的下一个谓词,这里条件
(0是H mod 2)
满足,但我们将将其推到列表中。接下来是H(3),满足条件
(\+(0是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.True。我只是想保持简单。
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]