[英]what's the difference between #= and =:= in SWI prolog
SWI prolog中#=
和=:=
之間有什么區別?
我從SWI prolog中找到了這個定義,但仍然對此感到困惑。
http://www.swi-prolog.org/pldoc/man?section=arithpreds
http://www.swi-prolog.org/pldoc/man?section=clpfd-arith-constraints
?- 3=:=3.
true.
?- (3-2) =:= (9-8).
true.
?- 3 #= 3.
true.
?- (3-2) #= (9-8).
true.
SWI prolog中#=和=:=之間有什么區別?
不同之處在於#=/2
是一個CLPFD庫操作符(你需要執行: use_module(library(clpfd)).
才能使用它)並且用於算術約束和包含is/2
和=:=/2
整數 。 這意味着你只能將它用於整數:
例如,使用列表會引發錯誤:
?- L #= [1,2,3].
ERROR: Domain error: `clpfd_expression' expected, found `[1,2,3]'
(同樣使用=:=/2
的列表會引發錯誤,列表示例僅用於理解兩個運算符都用於表達式!)
對於整數,它可以在任何地方使用=:=
可以使用,但如上所述,它可以按原樣使用is/2
,這意味着你可以使用它進行統一 - 只需將變量與某個整數值綁定,例如:
?- X #= 2.
X = 2.
因為X在無界變量中,所以上面沒有檢查X和數字2之間的相等性,它做的是將X與值2綁定。
使用=:=/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之間的關系,綁定一個變量可以導致另一個變量的推理。
在您的測試中,您看到沒有區別,因為所有變量都有值(例如它們被實例化),並且您可以簡單地檢查兩個運算符實現的相等性。
看這個例子:
:- 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.