我對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來實現這個功能,並且真的不希望手工實現邏輯行爲。歡迎任何關於如何重新構造問題的建議。
謝謝,整理出它很好地爲我。我想我必須基於二進制來實現我的問題,因爲我知道它是對稱的,但正如你所說,Prolog不知道這一點是完全合理的。 – 2011-02-16 18:32:46