2011-02-16 45 views
3

我對prolog仍然很陌生,並且試圖圍繞爲什麼數學約束似乎不符合邏輯運算的相同方式。序言是和=。他們爲什麼不像邏輯限制那樣工作?

好像有足夠的信息來解決這個問題:

f(A, B) :- A = (B xor 2). 

但是當我嘗試f(C, 3),我回來C = 3 xor 2.這是不是非常有幫助。更有用的是,如果輸入反向,它根本無法找到解決方案。使用is而不是=使示例輸入返回正確的答案,但反過來拒絕嘗試任何操作。

從我以前的實驗看來,我似乎可以編寫一個函數,它在邏輯上使用二進制來完成,而且沒有問題,而且實際上它們都是雙向的。什麼使數學不同?

作爲參考,我在我的解決問題的第一次嘗試是這樣的:

 
f(Input, Output) :- 
    A is Input xor (Input >> 11), 
    B is A xor ((A >> 7) /\ 2636928640), 
    C is B xor ((B << 15) /\ 4022730752), 
    Output is C xor (C >> 18). 

這工作得很好,從輸入要輸出,而不是周圍的其他方法。如果我將is切換爲=,它會生成一個長的邏輯序列,其值會被替換,但無法找到數值解。

我正在使用內置了xor的swi-prolog,但它可以很容易地定義。我希望能夠在兩個方向上使用prolog來實現這個功能,並且真的不希望手工實現邏輯行爲。歡迎任何關於如何重新構造問題的建議。

回答

5

Pure Prolog不應該處理數學。驅動Prolog的基本算法 - 統一和回溯失敗 - 沒有提及算術運算符。大多數Prolog實現將算術作爲醜陋的黑客入侵到他們的字節碼中。

其原因在於算術函數與函子的作用方式不同。他們不能以相同的方式統一。並非每個功能都能保證適用於每個組合的基礎和未磨製論點。例如,將X提升到Y的冪的算法對於找到X的Yth根是不對稱的。如果所有算術函數都是對稱的,那麼加密和密碼算法將不起作用!

也就是說,這裏有關於Prolog的運營商缺少的事實:

首先, '=' 是在序言 「等於」,但 「統一」。目標X = Y op Z其中op是運營商,與函數'op'(Y,Z)統一X。它與算術平等或賦值無關。

其次,is,醜陋的數學黑客,並不保證是可逆的。目標X is Expr(其中Expr是一個算術表達式)首先評估表達式,然後嘗試將其分配給X。它不會總是適用於每個數字和變量的組合 - 請檢查您的Prolog庫文檔。

總結:

  • 編寫可逆數學函數需要的數學知識和算法,使功能可逆的。在這種情況下,Prolog不會爲你做魔術。
  • 如果您正在尋找智能方程求解,您可能需要檢查Prolog約束求解庫的有限域和連續域。與可逆數學不同,但比Prolog的樸素算術運算符稍微聰明一點。
+0

謝謝,整理出它很好地爲我。我想我必須基於二進制來實現我的問題,因爲我知道它是對稱的,但正如你所說,Prolog不知道這一點是完全合理的。 – 2011-02-16 18:32:46

0

如果您想比較評估表達式的結果,您應該使用運算符(=:=)/ 2,或者在檢查運算符(=/=)/ 2的分離度時使用。

該運算符也適用於按位運算,因爲按位運算用於內積,整數是數字。運營商是ISO核心標準的一部分。對於以下條款:

f(A, B) :- A =:= (B xor 2). 

我得到以下運行時,在SWI-Prolog的,Jekejeke的Prolog等..:

Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.31) 
Copyright (c) 1990-2016 University of Amsterdam, VU Amsterdam 

?- f(100, 102). 
true. 

?- f(102, 100). 
true. 

?- f(100, 101). 
false. 

如果你想處理位更聲明的方式,你可以使用SAT解決程序集成到Prolog中。一個好的SAT求解器也應該支持有限或無限的位向量,但是我無法確定當前可用的條件以及限制條件。

例如見這個問題在這裏: Prolog SAT Solver

相關問題