[英]Turing machine for addition and comparison of binary numbers
今天是個好日子!
我正在嘗試解決此練習以進行學習。 有人可以指導我解決這三個問題嗎?
就像我嘗試了第一個問題,以“+”分隔的 2 個二進制數相加。 在那里我通過用相應數量的 1 或零表示每個數字來嘗試 2 個數字加法,例如 5 = 1 1 1 1 1 或 0 0 0 0 0 然后將它們相加,結果也將與所表示的格式相同,但如何添加或表示 2 個二進制文件並用 + 分隔它們,沒有得到任何線索。 圖靈機的頭部會從左邊移動到加號然后左右移動+號嗎? 但是將如何執行添加。 就我的一點知識而言,TM 不能簡單地添加二進制文件,我們必須制定一些邏輯來表示它的二進制文件,就像簡單地將 2 個數字相加一樣。 比較2個二進制文件的情況類似嗎? 問候
我將從問題 2 和 3 開始,因為它們實際上比問題 1 容易。
我們假設我們有有效的輸入(兩邊的非空二進制字符串,沒有前導零),所以我們不需要做任何輸入驗證。 要檢查數字是否相等,我們可以簡單地在 = 符號上來回彈跳並一次划掉一位數字。 如果我們在任何時候發現不匹配,我們就會拒絕。 如果我們在左邊有一個數字,而在右邊找不到一個,我們就拒絕。 如果左邊的數字用完而右邊還有一些,我們拒絕。 否則,我們接受。
Q T Q' T' D
q0 0 q1 X right // read the next (or first) symbol
q0 1 q2 X right // of the first binary number, or
q0 = q7 = right // recognize no next is available
q1 0 q1 0 right // skip ahead to the = symbol while
q1 1 q1 1 right // using state to remember which
q1 = q3 = right // symbol we need to look for
q2 0 q2 0 right
q2 1 q2 1 right
q2 = q4 = right
q3 X q3 X right // skip any crossed-out symbols
q3 0 q5 X left // in the second binary number
q3 1,b rej 1 left // then, make sure the next
q4 X q4 X,b right // available digit exists and
q4 0,b rej 0,b left // matches the one remembered
q4 1 q5 X left // otherwise, reject
q5 X q5 X left // find the = while ignoring
q5 = q6 = left // any crossed-out symbols
q6 0 q6 0 left // find the last crossed-out
q6 1 q6 1 left // symbol in the first binary
q6 X q0 X right // number, then move right
// and start over
q7 X q7 X right // we ran out of symbols
q7 b acc b left // in the first binary number,
q7 0,1 rej 0,1 left // make sure we already ran out
// in the second as well
這個 TM 可以首先通過確保兩個二進制字符串都是非空的並且不包含前導零(划掉它找到的任何東西)來清理輸入。
做“大於”,你可以很容易地做到以下幾點:
檢查第一個二進制數的長度(去除前導零后)是否大於、等於或小於第二個二進制數(去除前導零后)的長度。 如果第一個比第二個長,請接受。 如果第一個比第二個短,則拒絕。 否則,繼續執行步驟 2。
像在另一個問題中一樣檢查相等性,但是如果在任何時候第一個數字中有 1 並且在第二個數字中有 0,則接受。 這是有效的,因為我們知道沒有前導零,數字具有相同的位數,並且我們正在按重要性的降序檢查數字。 如果您發現其他不匹配或您確定數字相等,則拒絕。
要添加數字,問題說要遞增和遞減,但我覺得只添加進位不會太難。 該程序的概要是這樣的:
磁帶可能經歷的不同步驟的示例:
#1011+101#
#101X+101#
#101X+10X#
#101X+10X=#
#101X+10X=0#
#10XX+10X=0#
#10XX+1XX=0#
#10XX+1XX=00#
#1XXX+1XX=00#
#1XXX+XXX=00#
#1XXX+XXX=000#
#XXXX+XXX=000#
#XXXX+XXX=0000#
#XXXX+XXX=00001#
#XXXX+XXX=0000#
#1XXX+XXX=0000#
#1XXX+XXX=000#
#10XX+XXX=000#
#10XX+XXX=00#
#100X+XXX=00#
#100X+XXX=0#
#1000+XXX=0#
#1000+XXX=#
#10000XXX=#
#10000XXX#
#10000XX#
#10000X#
#10000#
有兩種方法可以解決加法問題。 假設您的輸入磁帶采用^a+b$
形式,其中^
和$
是告訴您已經到達輸入的正面和背面的符號。
b
並減少a
1
直到a
為 0,此時b
將是您的答案。 這是假設您可以輕松編寫可以遞增和遞減的 TM。 對於任一選項,您都需要代碼來查找a
和b
的最低有效位。 該問題指定最重要的位是第一位,因此您需要從+
開始a
和$
開始b
。
例如,假設我們要增加1011$
。 我們將使用的算法是找到最不重要的未標記數字。 如果它是一個0
,用一個1
替換它。 如果是1
,則向左移動。
1
。 將讀取頭向左移動。1
。 將讀取頭向左移動。0
。 寫1
.1111$
。 要比較兩個數字,您需要跟蹤已查看過的值。 這是通過使用“標記”字符擴展字母表來完成的。 0
可以標記為X
, 1
標記為Y
。 X
意思是“這里有一個 0,但我已經看到了。
因此,對於平等,我們可以開始^
了a
和=
為b
。 (假設輸入看起來像^a=b$
。)算法是找到a
和b
的開始,比較每個的第一個未標記位。 第一次達到不同的值時,停止並拒絕。 如果您到達=
和$
,請停止並拒絕。
讓我們看看輸入^11=10$
:
1
。 寫Y
。 磁帶讀取^Y1=10$
。 我們處於表示已讀取1
。=
。1
。 這與我們之前閱讀的位相匹配。 寫一個Y
。^
。1
在a
與閱讀0
中b
。 我們會停下來拒絕。希望這有助於您入門。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.