การดำเนินการเชิงสัมพันธ์โดยใช้เฉพาะส่วนเพิ่ม วนรอบ กำหนด หรือศูนย์

นี่เป็นคำถามติดตามผลสำหรับ: การดำเนินการลบโดยใช้เฉพาะส่วนเพิ่ม วนซ้ำ กำหนด เป็นศูนย์

เราได้รับอนุญาตให้ใช้การดำเนินการต่อไปนี้เท่านั้น:

  1. incr(x) - เมื่อเรียกใช้ฟังก์ชันนี้ มันจะกำหนด x + 1 ให้กับ x
  2. มอบหมาย(x, y) - ฟังก์ชันนี้จะกำหนดค่าของ y ให้กับ x (x = y)
  3. ศูนย์(x) - ฟังก์ชั่นนี้จะกำหนด 0 ให้กับ x (x = 0)
  4. วนซ้ำ X { } - การดำเนินการที่เขียนภายในวงเล็บจะถูกดำเนินการ X ครั้ง

ตัวอย่างเช่น การบวกสามารถทำได้ดังนี้:

add(x, y) {
    loop x
        { y = incr(y) }
    return y
}

ฉันจะใช้ ตัวดำเนินการเชิงสัมพันธ์ โดยใช้การดำเนินการทั้งสี่นี้ได้อย่างไร การดำเนินการเชิงสัมพันธ์คือ:

  1. eq(x, y) - x เท่ากับ y หรือไม่?
  2. lt(x, y) - x น้อยกว่า y หรือไม่?
  3. gt(x, y) - x มากกว่า y หรือไม่?

เราก็มีสิ่งที่ตรงกันข้ามเช่นกัน:

  1. ne(x, y) - x ไม่เท่ากับ y หรือไม่?
  2. gte(x, y) - x มากกว่าหรือเท่ากับ y หรือไม่?
  3. lte(x, y) - x น้อยกว่าหรือเท่ากับ y หรือไม่?

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม.


person Swathi Devireddy    schedule 16.01.2016    source แหล่งที่มา
comment
บางทีคุณอาจสนใจที่จะเรียนรู้เกี่ยวกับ แคลคูลัส Lambda และ การเข้ารหัสคริสตจักร คำถามของคุณจะได้รับคำตอบโดยตรงในบทความทั้งสองนี้   -  person Aadit M Shah    schedule 16.01.2016
comment
คุณควรยอมรับคำตอบของฉันหากสามารถแก้ไขปัญหาของคุณได้ คลิกเครื่องหมายถูกข้างคำตอบของฉัน   -  person Aadit M Shah    schedule 16.01.2016


คำตอบ (1)


เซตของจำนวนธรรมชาติ N ถูกปิดภายใต้การบวกและการลบ:

N + N = N
N - N = N

ซึ่งหมายความว่าการบวกหรือการลบจำนวนธรรมชาติสองตัวก็เป็นจำนวนธรรมชาติเช่นกัน (เมื่อพิจารณาว่า 0 - 1 เป็น 0 และไม่ใช่ -1 เราจะไม่สามารถมีจำนวนธรรมชาติติดลบได้)

อย่างไรก็ตาม เซตของจำนวนธรรมชาติ N จะไม่ถูกปิดภายใต้การดำเนินการเชิงสัมพันธ์:

N < N = {0, 1}
N > N = {0, 1}

ซึ่งหมายความว่าผลลัพธ์ของการเปรียบเทียบจำนวนธรรมชาติสองตัวคือความจริง (เช่น 1) หรือความเท็จ (เช่น 0)

ดังนั้นเราจึงถือว่าชุดของบูลีน (เช่น {0, 1}) เป็นชุดจำกัดของจำนวนธรรมชาติ (เช่น N)

false = 0
true  = incr(false)

คำถามแรกที่เราต้องตอบคือเราจะเข้ารหัสคำสั่ง if เพื่อแยกย่อยตามความจริงหรือความเท็จได้อย่างไร คำตอบนั้นง่ายมาก เราใช้การดำเนินการ loop:

isZero(x) {
    y = true
    loop x { y = false }
    return y
}

หากเงื่อนไขการวนซ้ำคือ true (เช่น 1) การวนซ้ำจะดำเนินการเพียงครั้งเดียว หากเงื่อนไขการวนซ้ำคือ false (เช่น 0) แสดงว่าการวนซ้ำไม่ทำงาน เราสามารถใช้สิ่งนี้เพื่อเขียนรหัสสาขา

แล้วเราจะนิยามการดำเนินการเชิงสัมพันธ์ได้อย่างไร? ปรากฎว่าทุกอย่างสามารถกำหนดได้ในรูปของ lte:

lte(x, y) {
    z = sub(x, y)
    z = isZero(z)
    return z
}

เรารู้ว่า x ≥ y เหมือนกับ y ≤ x ดังนั้น:

gte(x, y) {
    z = lte(y, x)
    return z
}

เรารู้ว่าถ้า x > y เป็นจริง ดังนั้น x ≤ y จะเป็นเท็จ ดังนั้น:

gt(x, y) {
    z = lte(x, y)
    z = not(z)
    return z
}

เรารู้ว่า x < y เหมือนกับ y > x ดังนั้น:

lt(x, y) {
    z = gt(y, x)
    return z
}

เรารู้ว่าถ้า x ≤ y และ y ≤ x แล้วก็ x = y ดังนั้น:

eq(x, y) {
    l = lte(x, y)
    r = lte(y, x)
    z = and(l, r)
    return z
}

สุดท้ายนี้ เรารู้ว่าถ้า x = y เป็นจริง x ≠ y จะเป็นเท็จ ดังนั้น:

ne(x, y) {
    z = eq(x, y)
    z = not(z)
    return z
}

ตอนนี้สิ่งที่เราต้องทำคือกำหนดฟังก์ชันต่อไปนี้:

  1. ฟังก์ชัน sub ถูกกำหนดไว้ดังนี้:

    sub(x, y) {
        loop y
            { x = decr(x) }
        return x
    }
    
    decr(x) {
        y = 0
        z = 0
    
        loop x {
            y = z
            z = incr(z)
        }
    
        return y
    }
    
  2. ฟังก์ชัน not เหมือนกับฟังก์ชัน isZero:

    not(x) {
        y = isZero(x)
        return y
    }
    
  3. ฟังก์ชัน and เหมือนกับฟังก์ชัน mul:

    and(x, y) {
        z = mul(x, y)
        return z
    }
    
    mul(x, y) {
        z = 0
        loop x { z = add(y, z) }
        return z
    }
    
    add(x, y) {
        loop x
            { y = incr(y) }
        return y
    }
    

นั่นคือทั้งหมดที่คุณต้องการ หวังว่าจะช่วยได้

person Aadit M Shah    schedule 16.01.2016
comment
ขอบคุณมาก Aadit น่าสนใจ - person Swathi Devireddy; 16.01.2016
comment
อธิบายได้ดีมาก - person Leandro Caniglia; 16.01.2016
comment
ขอบคุณ @LeandroCaniglia - person Aadit M Shah; 16.01.2016