设L是一个数字列表,并考虑以下Prolog对具有流模型(输入、输出(的谓词g(列表、列表(的定义:
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不为零,因此条件为true,并且这个1被推到List中。现在转到下一个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]