我目前正在荷兰学习人工智能。我们已经对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
答案 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!
剩下要做的就是填写缺失的部分。
递归!