我在編寫一個Prolog謂詞時遇到了麻煩,該謂詞返回某些算術的變量值。序言:解決多變量算法
例如,該函數應該返回x和y可以來自等式:12 = 3x + 2y。
目前我的代碼只能解決其他方式:
foo(S,X,Y) :-
S is 3*X+2*Y.
任何想法?
我在編寫一個Prolog謂詞時遇到了麻煩,該謂詞返回某些算術的變量值。序言:解決多變量算法
例如,該函數應該返回x和y可以來自等式:12 = 3x + 2y。
目前我的代碼只能解決其他方式:
foo(S,X,Y) :-
S is 3*X+2*Y.
任何想法?
你可以沿着使用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.
問候
根據所在的建模域,使用以下選項之一:
這裏是你如何處理與整數clpfd:
:- 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.
任意精度有理數,使用clpq:
:- 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}.
在過去的浮點數關係,使用clpr:
:- 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.
Prolog沒有任何*函數*。沒有。你也不能在Prolog中定義自己的*函數*。儘管它有預定義和用戶自定義,但它對* predicates *做了很好的工作。 :)查看CLPFD庫。 – lurker 2015-04-01 01:58:56
想法:查看'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
從哪個域繪製'X'和'Y'的值?整型?有理數?雷亞爾? – repeat 2015-04-01 14:59:10