【问题标题】:Prolog: dividing a numberProlog:除数
【发布时间】:2014-11-20 18:44:33
【问题描述】:

我想创建一个返回数字分隔符列表的谓词。 示例: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 而不是列表。

编辑:

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

【问题讨论】:

  • use the same predicate to get different answer:通过解决方案回溯

标签: numbers prolog divider


【解决方案1】:

您的代码中的一个问题是它一直试图将数字P 除以D,即使很明显除法不会成功,因为D 太高了。这让D 无限制地“逃跑”。

添加检查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) &gt; 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)。

【讨论】:

  • 非常感谢,所以我必须检查是否低于或等于但不仅限于低于。
  • @chnging 是的,否则您将永远无法到达基本子句(除非您以 P 开头等于 1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多