2015-04-01 60 views
3

我在編寫一個Prolog謂詞時遇到了麻煩,該謂詞返回某些算術的變量值。序言:解決多變量算法

例如,該函數應該返回x和y可以來自等式:12 = 3x + 2y。

目前我的代碼只能解決其他方式:

foo(S,X,Y) :- 
    S is 3*X+2*Y. 

任何想法?

+3

Prolog沒有任何*函數*。沒有。你也不能在Prolog中定義自己的*函數*。儘管它有預定義和用戶自定義,但它對* predicates *做了很好的工作。 :)查看CLPFD庫。 – lurker 2015-04-01 01:58:56

+2

想法:查看'library(clpfd)'http://www.swi-prolog.org/pldoc/man?section=clpfd如果你只需要整數和'library(clpr)'http://www.swi- prolog.org/pldoc/man?section=clpqr處理實際情況。然而,我不確定'Y = 6.0-1.5 * X'是否比'12 = 3 * X + 2 * Y'真實的改善,但你應該更清楚你需要什麼。 – 2015-04-01 02:31:20

+1

從哪個域繪製'X'和'Y'的值?整型?有理數?雷亞爾? – repeat 2015-04-01 14:59:10

回答

0

你可以沿着使用var/1謂詞來檢查 參數是否是輸出去:

foo(S, X, Y) :- var(X), !, X is (S-2*Y)/3. 
foo(S, X, Y) :- var(Y), !, Y is (S-3*X)/2. 
foo(S, X, Y) :- S is 3*X+2*Y. 

這裏是SWI-Prolog的運行例如:

?- foo(S, 1, 2). 
S = 7. 
?- foo(7, X, 2). 
X = 1. 
?- foo(7, 1, Y). 
Y = 2. 

問候

2

根據所在的建模域,使用以下選項之一:

  • 爲整數

  • 爲任意精度有理數

  • 爲限於精度 「實數」,典型地通過浮點近似值

  • 布爾值


這裏是你如何處理與整數

:- use_module(library(clpfd)). 

foo(S,X,Y) :- 
    S #= 3*X+2*Y. 

讓我們看一些樣本查詢!

首先:地面查詢。

?- foo(1,23,-34). 
true. 

?- foo(1,23,-2). 
false. 

接下來是:一些查詢與一個變量。

 
?- foo(X,1,2). 
X = 7. 

?- foo(1,X,2). 
X = -1. 

?- foo(1,23,X). 
X = -34. 

?- foo(1,2,X). 
false. 

然後,用一個變量的查詢在多個地方使用:

 
?- foo(X,X,X). 
X = 0. 

最後:一些更一般的查詢。

?- foo(S,X,2). 
S#=3*X+4. 

?- foo(S,X,Y). 
S#=3*X+2*Y. 

任意精度有理數,使用

:- use_module(library(clpq)). 

?- foo(X,X,X). 
X = 0. 

?- foo(1,2,X).   % a similar query failed with clp(FD) 
X = -5 rdiv 2.   % arbitrary-precision solution 

?- foo(S,X,Y). 
{Y=1 rdiv 2*S-3 rdiv 2*X}. 

在過去的浮點數關係,使用

:- use_module(library(clpr)). 

foo(S,X,Y) :- 
    { S = 3*X+2*Y }. 

樣品闕ries:

?- foo(1,2,X).   % a similar query failed with clp(FD) 
X = -2.5 ;    % and had an arbitrary-precision solution with clp(Q) 
false. 

?- foo(X,X,X). 
X = 0.0 ; 
false.