簡體   English   中英

SWI prolog中#=和=:=之間的區別是什么

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM