2012-02-04 83 views
1

我有這樣的場景,其中,我在序言查詢得到一個線性方程如下面:如何處理在prolog的目標/查詢中傳遞的方程式?

?- myquery(3X + 5Y = 10, Result). 

所以我的查詢有一個方程3X + 5Y = 10,這在一般的假設的形式AX + BY = C,其中A = 3,B = 5和C = 10。

現在,在我的Prolog程序,我試圖定義一個謂詞,可以採取在上面的查詢中提到的表達。也就是說,我不知何故想獲得A,B和C值,並且也涉及操作符(在上述情況下爲加號操作符),然後將其用於我用程序定義的邏輯。我想知道如何做到這一點。

更通用的,問題是如何識別常量和參與是通過目標/查詢通過如下方程在操作?

我是新來的Prolog,任何幫助非常感謝。

+0

您使用的是什麼prolog的實現?看起來在swi-prolog中你不能有你描述的形式的參數(3X + 5Y = 10) – 2012-02-04 18:30:16

+0

我正在尋找eclipse prolog,但任何東西都應該沒問題,我只需要讓概念正確。 – kallakafar 2012-02-04 18:41:19

回答

1

下列轉錄物可以證明照明:

32 ?- Term = (3*_X + 5*_Y = 10), functor(Term,F,A). 

Term = 3*_G527+5*_G530=10 
F = = 
A = 2 

33 ?- Term = (3*_X + 5*_Y = 10), arg(Arg,Term,Val). 

Term = 3*_G459+5*_G462=10 
Arg = 1 
Val = 3*_G459+5*_G462 ; % user pressed ';' interactively 

Term = 3*_G459+5*_G462=10 
Arg = 2 
Val = 10 ; % user pressed ';' interactively 

No 
35 ?- Term = (3*_X + 5*_Y = 10), arg(1,Term,Val1), functor(Val1,F1,A1), 
     arg(2,Val1,Val12). 

Term = 3*_G693+5*_G696=10 
Val1 = 3*_G693+5*_G696 
F1 = + 
A1 = 2 
Val12 = 5*_G696 

最後查詢讀:爲給定的,第一的TermargVal1Term,的Val1函子是F1與元數A1(意思是,它具有A1 args - 子部分 - 本身),而第二個arg這個術語在Val1中的名字是Val12。爲了澄清,在Prolog中任何符號數據是在fff(aa,bb,cc,...)的形式,其中fff是一些名稱,稱爲算符,和「參數」中的表達可以通過arg呼叫來訪問。

這意味着,原始表達式(3*_X + 5*_Y = 10)實際上存儲在Prolog中作爲'='('+'('*'(3,_X), '*'(5,_Y)), 10)。當你到了原子的部分(與元數0函子),你可以進一步檢查它們:

47 ?- arg(1,(3*X),V), functor(V,F,A), number(V). 

X = _G441 
V = 3 
F = 3 
A = 0 

Yes 

編輯:回答您的其他問題(從評論):

1 ?- (3*_X + 5*_Y = 10) = (A*X + B*Y = C). 

A = 3 
X = _G412 
B = 5 
Y = _G415 
C = 10 

Yes 

如果你堅持不寫出明確的乘號*,你將不得不把你的術語表示爲字符串,並分析該字符串。這將是一個更加複雜的任務。

編輯:另一件事是嘗試=..斷言,所謂的 「大學」:

4 ?- (3*_X + 5*_Y = 10) =.. X. 

X = [=, 3*_G454+5*_G457, 10] 

Yes 
5 ?- (3*_X + 5*_Y = 10) =.. X, X=[X1,X2,X3], X2 =.. Y. 

X = [=, 3*_G545+5*_G548, 10] 
X1 = = 
X2 = 3*_G545+5*_G548 
X3 = 10 
Y = [+, 3*_G545, 5*_G548] 

Yes 
+0

感謝您的編輯..我似乎現在得到邏輯。讓我試試看。 – kallakafar 2012-02-05 10:49:34

+0

@kallakafar btw如果您不知道這一點,在Stackoverflow中,您可以*通過點擊旁邊的大空綠色複選標記(V形),接受*答案,如果/您認爲回答您的問題。它會給作者一些聲望點(15?)。此外,還可以對答案進行「投票」,從而獲得10個聲望點。 SO體驗的一部分。 :) – 2012-02-05 11:16:15

+0

是的,我確實嘗試upvote這個答案,但後來它說我需要15點自己做到這一點,不幸的是我不。我沒有把它標記爲回答,所以我可以自己嘗試一下,也許會發布後續問題。 :)我會,一旦我完成了......當然!謝謝,威爾。 – kallakafar 2012-02-05 13:07:34

1

可以例如使用術語檢查謂詞:ARG/3,算符/ 3,VAR/1,(= ..)/ 2等

+0

嗯..請你詳細說明如何將3存儲在A1中,x爲A2,5爲B1,Y爲B2和10爲C(從我在主要問題中給出的例子)..?我仍然在如何使用arg(或者對於函數/ 3,var/1等),我引用了這個例子。謝謝! – kallakafar 2012-02-04 18:20:05

2

SWI-Prolog有一個約束library clp(Q,R)是解決在象徵性的水平以下公式:

[debug] ?- [library(clpq)]. 
% library(clpq) compiled into clpq 0,27 sec, 992 clauses 
true. 

?- {3 * X + 5 * Y = 10}. 
{Y=2-3 rdiv 5*X}. 

Eclipse肯定會有更先進的東西。這些庫不是簡單的,難...

您感興趣的是,使用Prolog語法,作爲主機語言,所以通常的內置函數可以用於識別變量,常量等。

相關問題