1
我想了解自己的序言,需要一点帮助。Prolog简单生成器
有人能解决和解释这个问题:
定义AP(A,M/N,K/L),其产生的所有可能的有理分数M/N和K/L,其中:
N>M>0, K>L>0, (M/N)*(K/L) = 2 and (M+K)<A
我想了解自己的序言,需要一点帮助。Prolog简单生成器
有人能解决和解释这个问题:
定义AP(A,M/N,K/L),其产生的所有可能的有理分数M/N和K/L,其中:
N>M>0, K>L>0, (M/N)*(K/L) = 2 and (M+K)<A
你的描述对我来说并不那么清楚,我宁愿猜测哪些值应该被知道,哪些被问到。所以我宁愿使用library(clpfd)
,我不需要自己做这样的考虑。
N>M>0, K>L>0, (M/N)*(K/L) = 2 and (M+K)<A
p(A, M/N, K/L) :-
N #> M, M #> 0,
K #> L, L #> 0,
M+K #< A,
(M/N) * (K/L) #= 2.
?- 3/2 #= F.
F = 1.
?- (3/2)*2 #= F.
F = 2.
哦,clpfd是整数所以分数将被截断。我需要一些代数第一,两侧(N*L)
乘以(他们都是不为0 ...):
p(A, M/N, K/L) :-
N #> M, M #> 0,
K #> L, L #> 0,
M+K #< A,
M*K #= 2*N*L.
?- p(A, M/N, K/L).
A in 4..sup,
M+K+ -1*A#=< -1,
M in 1..sup,
M#=<N+ -1,
M*K#=_G4798012,
N in 2..sup,
2*N#=_G4798036,
_G4798036 in 4..sup,
_G4798036*L#=_G4798012,
L in 1..sup,
L#=<K+ -1,
K in 2..sup,
_G4798012 in 4..sup.
所以序言说:是的!这是真的提供了所有这些非常精美的打印是真实的。第一行是最有趣的A in 4..sup
,这意味着A
没有上限。要得到具体解决方案,必须知道A
:
?- A #= 10, p(A, M/N, K/L).
A = 10,
M in 1..7,
M+K#=_G4801546,
M#=<N+ -1,
M*K#=_G4801570,
K in 2..8,
L#=<K+ -1,
L in 1..7,
_G4801620*L#=_G4801570,
_G4801620 in 4..56,
2*N#=_G4801620,
N in 2..28,
_G4801570 in 4..56,
_G4801546 in 3..9.
不够!但现在K, L, M, N
都有有限域,所以我们可以使用labeling([], [K,L,M,N])
来枚举它们。
?- A = 10, p(A,M/N,K/L),labeling([],[M,N,K,L]).
A = 10,
M = L, L = 1,
N = 2,
K = 4 ;
A = 10,
M = 1,
N = L, L = 2,
K = 8 ;
A = 10,
M = L, L = 1,
N = 3,
K = 6 ...
你尝试过什么吗?你对prolog有什么经验? – vmg 2014-11-21 23:59:47
让别人解决整个问题并向您解释并不是学习Prolog的好方法。学习Prolog的最佳方式是从非常简单的问题开始,先解决问题,然后在问题发生的地方提问。然后转向更复杂的。 – lurker 2014-11-22 03:00:02
应该读取'M> N> 0'吗? – false 2014-11-22 11:20:10