Prolog谓词检查列表中数字的可分性

时间:2011-03-05 06:33:07

标签: prolog

例如

divisible([L1],X) :-
L1 mod X =:= 0.

查询

divisible([4,6,8,7],2).

响应

[4,6,8]

任何指导?

4 个答案:

答案 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)

divisor_of_t/3一起使用tfilter/3 reified test predicate

?- tfilter(divisor_of_t(2),[4,6,8,7],Zs).
Zs = [4, 6, 8].

根据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).