例如
divisible([L1],X) :-
L1 mod X =:= 0.
查询
divisible([4,6,8,7],2).
响应
[4,6,8]
任何指导?
答案 0 :(得分:3)
您将需要一个三参数谓词(输入列表,值以测试可分性和输出列表)。在此之后,考虑三种情况:输入列表为空,第一个元素不能被数字整除,第一个元素可以被数字整除。您应该能够编写三个子句,每个子句各一个,并获得正确的谓词。
答案 1 :(得分:3)
divisible([], _, []).
divisible([H|T], X, [H|T1]) :- H mod X =:= 0, divisible(T, X, T1).
divisible([H|T], X, T1) :- H mod X =\= 0, divisible(T, X, T1).
答案 2 :(得分:2)
SWI-Prolog有一个很好的谓词include/3
,您可以这样使用:
?- include(divides(2), [4, 6, 8, 7], L).
L = [4, 6, 8].
鉴于您已定义divides/2
:
% Succeeds if X divides Y
divides(X, Y) :-
Y mod X =:= 0.
答案 3 :(得分:1)
与meta-predicate divisor_of_t/3
一起使用tfilter/3
reified test predicate:
?- tfilter(divisor_of_t(2),[4,6,8,7],Zs).
Zs = [4, 6, 8].
根据clpfd和bool01_truth/2
,我们可以按如下方式定义divisor_of_t/3
:
:- use_module(library(clpfd)).
divisor_of_t(Y,X,Truth) :- X mod Y #= 0 #<==> B, bool01_truth(B,Truth).