排除 Prolog 中的偶数
Excluding even numbers in Prolog
令 L 为数值列表并考虑以下 Prolog 定义的谓词 g(list,list) 和流模型 (input,output):
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]。这样解释好吗?
想法是运行谓词组成一个没有偶数的列表。
解释:
让我们从一个例子 [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]
令 L 为数值列表并考虑以下 Prolog 定义的谓词 g(list,list) 和流模型 (input,output):
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]。这样解释好吗?
想法是运行谓词组成一个没有偶数的列表。
解释:
让我们从一个例子 [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]