带分解的序言练习

时间:2018-09-20 07:51:22

标签: prolog prime-factoring

我目前正在荷兰学习人工智能。我们已经对Prolog进行了一些介绍,这些介绍非常简单易懂,但是我们要做的练习却有些困难。

我不完全理解的练习是练习5.6。有人可以给我一个提示/解释一下如何解决这个问题,并最终制定一个可行的程序吗?

非常感谢您!

  

锻炼5.6。   写一个谓词   factor/2   计算一个素数的素因式分解   给定的整数> 2(等于或大于2)。

     

使用与以下示例相同的符号:

?- factor(30, X).
X = [2, 3, 5]
Yes

?- factor(300, X).
X = [2^2, 3, 5^2]
Yes

?- factor(1024, X).
X = [2^10]
Yes

?- factor(17, X).
X = [17]
Yes
     

使用您的程序来计算7777777的素因式分解和   12345654321

我尝试过的是 这个基本情况:

factor(_, 0, []).

(可能不完美)

factor(N, Result):-
    factor(N, N2, X, Result).
factor(N, N3, X, Result):-
    N2 is N3 - 1.
    N mod N2 is X

1 个答案:

答案 0 :(得分:1)

所以你想让它保持住

factor(30, [2, 3, 5]).
factor(300, [2^2, 3, 5^2]).
factor(1024, [2^10]).
factor(17, [17]).

让我们首先了解一下

3 ?- write_canonical( factor(300, [2^2, 3, 5^2]) ).
factor(300,[^(2,2),3,^(5,2)])
true.

显然我们要

factor(10, [2, 5]).

我们知道30 * 10 == 300,因此我们有

factor(30, [2, 3, 5]).
factor(10, [2, 5]).
factor(300, [2^2, 3, 5^2]).

所以让我们先解决更简单的

factor(30, [2, 3, 5]).
factor(10, [2, 5]).             %  10 ==  2*5
factor(300, [2, 2, 3, 5, 5]).   % 300 == 10*300

所以它也必须保持

factor(150, [2, 3, 5, 5]).      % 300 == 2 *150
factor(75, [3, 5, 5]).          % 150 == 2 *75
factor(25, [5, 5]).             %  75 == 3 *25
factor(5, [5]).                 %  25 == 5 *5

因此我们已经看到了

factor( N, [F | FS]) :- 
    between(2,N,F),
    ( divides(F, N) -> M is N div F, 
                       factor(.........)  ).   % recursion!

剩下要做的就是填写缺失的部分。

递归!