2014-11-21 55 views
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 
+0

你嘗試過什麼嗎?你對prolog有什麼經驗? – vmg 2014-11-21 23:59:47

+0

讓別人解決整個問題並向您解釋並不是學習Prolog的好方法。學習Prolog的最佳方式是從非常簡單的問題開始,先解決問題,然後在問題發生的地方提問。然後轉向更復雜的。 – lurker 2014-11-22 03:00:02

+0

應該讀取'M> N> 0'嗎? – false 2014-11-22 11:20:10

回答

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. 

所以序言說:是的!這是真的提供了所有這些非常精美的打印是真實的。第一行是最有趣的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 ...