What's the difference between #= and =:= in SWI prolog ?
不同的是,#=/2
是CLPFD庫操作(需要執行:use_module(library(clpfd)).
爲了使用它),它是用來用於算術約束和包含is/2
和=:=/2
int egers。這意味着,你只能用它的整數:
例如,使用列表將引發錯誤:
?- L #= [1,2,3].
ERROR: Domain error: `clpfd_expression' expected, found `[1,2,3]'
(也使用列表中=:=/2
會引發錯誤,列表例子只是爲了理解這兩個運營商用於表達式)
對於整數它可以在任何地方使用,可以使用=:=
但如上所述可以作爲is/2
這意味着你可以用它來統一 - !乾脆來個變量綁定某個整數值,例如:
?- X #= 2.
X = 2.
上述不檢查,因爲在無限可變X X和編號2之間的平等,但它確實與值2
粘接X什麼,這是不可能用=:=/2
操作者:
?- X =:= 2.
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [8] _2494=:=2
ERROR: [7] <user>
這是因爲=:=/2
只用於檢查是否相等!
這是#=/2
和=:=/2
之間的區別。 檢查兩個算術表達式之間的相等性,但使用=:=/2
時,所有變量都應該實例化。當使用#=/2
與變量此設置這些變量之間的約束:
?- X #= 2.
X = 2. % constraints X to integer value 2
?- X + Y #= 2.
X+Y#=2. % constraints X,Y such that sum equals to 2 see next example:
?- X + Y #= 2 , X = 3.
X = 3,
Y = -1. % binds Y with -1 in order to succeed the constraint
?- X + Y #= 2 , X = 3 , Y > 0.
false. % false since constraint can't succeed!
正如你可以看到#=/2
顯然更關係由於具有與一個以上的變量如X + Y #= 2.
約束,即使這臺X之間的關係,Y,綁定一個變量可以導致另一個推理。
在你的測試中,你看不出有什麼區別,因爲你所有的變量都有值(例如它們被實例化),並且你可以簡單地檢查兩個操作符實現的相等性。