下列轉錄物可以證明照明:
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
最後查詢讀:爲給定的,第一的Term
arg
是Val1
爲Term
,的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
您使用的是什麼prolog的實現?看起來在swi-prolog中你不能有你描述的形式的參數(3X + 5Y = 10) – 2012-02-04 18:30:16
我正在尋找eclipse prolog,但任何東西都應該沒問題,我只需要讓概念正確。 – kallakafar 2012-02-04 18:41:19