【问题标题】:Prolog simple generatorProlog 简单生成器
【发布时间】:2014-11-21 21:03:13
【问题描述】:

我正在尝试自学 Prolog,需要一些帮助。

谁能解决并解释这个问题:

定义一个 p(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 的体验如何?
  • 让其他人解决整个问题并向您解释并不是学习 Prolog 的好方法。学习 Prolog 的最佳方法是从非常简单的问题开始,自己解决问题并首先提出问题。然后转向更复杂的。
  • 应该写成M&gt;N&gt;0

标签: prolog logic


【解决方案1】:

您的描述对我来说不是那么清楚,我宁愿猜测应该知道哪些值以及询问哪些值。所以我宁愿使用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.

所以 Prolog 说:是的!这是真的只要所有这些非常精美的文字都是真的。第一行是最有趣的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 ...

【讨论】:

    猜你喜欢
    • 2012-08-20
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多