Prolog:划分一个数字

时间:2014-11-20 18:44:34

标签: numbers prolog divider

我想创建一个返回数字分隔符列表的谓词。 示例:72 = 2 * 2 * 2 * 3 * 3.

prdel(A,[],_):- 
      A is 1.
prdel(P,[D|L],D):-
      0 is mod(P,D),
      P1 is P/D,
      prdel(P1,L,D).
prdel(P,L,D):-
      D1 is D+1,
      prdel(P,L,D1).

这适用于并返回正确的列表。问题是它不会在此之后停止但是如果我按空格则一遍又一遍地返回相同的列表(对不起,当你使用相同的谓词来获得不同的答案时,我不知道英语中的术语)。我希望它在第一次之后停止。

我尝试编辑最后一个,

prdel(P,L,D):-
      D1 is D+1,
      D1<P,
      prdel(P,L,D1).

但现在它只返回false而不是列表。

编辑:

我正在寻找一个没有削减的答案。

1 个答案:

答案 0 :(得分:1)

您的代码中的一个问题是它一直试图将数字P除以D,即使明确该分部不会成功,因为D太高。这让D&#34;逃跑&#34;没有限制。

D1的检查添加到P之下或更低可以解决此问题:

prdel(1,[],_).

prdel(P,[D|L],D):-
      0 is mod(P,D),
      P1 is P/D,
      prdel(P1,L,D).

prdel(P,L,D):-
      D1 is D+1,
      D1 =< P,
      prdel(P,L,D1).

这会产生除数的所有组合,包括非素数除数(demo)。

[[2, 2, 2, 3, 3], [2, 2, 2, 9], [2, 2, 3, 6],
 [2, 2, 18], [2, 3, 3, 4], [2, 3, 12], [2, 4, 9],
 [2, 6, 6], [2, 36], [3, 3, 8], [3, 4, 6], [3, 24],
 [4, 18], [6, 12], [8, 9], [72]]

如果您不想这样,请在最后一个句子中添加mod(P,D) > 0的条件:

prdel(1,[],_).

prdel(P,[D|L],D):-
    0 is mod(P,D),
    P1 is P/D,
    prdel(P1,L,D).

prdel(P,L,D):-
    mod(P,D) > 0,
    D1 is D+1,
    D1 =< P,
    prdel(P,L,D1).

这只生成[2, 2, 2, 3, 3]demo)。