2017-10-15 152 views

回答

2

What's the difference between #= and =:= in SWI prolog ?

不同的是,#=/2是CLPFD庫操作(需要執行:use_module(library(clpfd)).爲了使用它),它是用來用於算術約束和包含is/2=:=/2int 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,綁定一個變量可以導致另一個推理。

在你的測試中,你看不出有什麼區別,因爲你所有的變量都有值(例如它們被實例化),並且你可以簡單地檢查兩個操作符實現的相等性。

1

看到這個例子:

:- use_module(library(clpfd)). 

solve_equation_1(X) :- X + 1 =:= 2. 
solve_equation_2(X) :- X + 1 #= 2. 
solve_equation_3(X,Y,Z) :- X + Y #= Z. 

正如你所預料的,solve_equation_1作品實例X,並且不爲未初始化爲=:=是一個簡單的操作檢查表達式的平等:

?- solve_equation_1(1). 
true. 

?- solve_equation_1(2). 
false. 

?- solve_equation_1(X). 
=:=/2: Arguments are not sufficiently instantiated 

#=不是這種情況。它並不真檢查什麼 - 它只是表明一些變量和一些數字是以某種特定的方式受到限制 - 例如,他們形成一個等式。真正的檢查和計算稍後會在之後進行,除非約束/等式非常簡單,以至於可以立即解決。這就是爲什麼非常簡單的情況下(如你的例子)#=可能看起來像=:=

看到這些例子 - 所有=:=是不可能的,他們表現出的#=這個結果是不是有些真/假布爾值,但新的約束:

?- solve_equation_2(X). 
X = 1. 

?- solve_equation_3(X,Y,2). 
X+Y#=2. 

?- X #= Y + Z, solve_equation_2(X). 
X = 1, 
Y+Z#=1