How to start Artificial Intelligence – list

บทนำ (Overview)

โครงสร้างลิสต์ (List) ได้กล่าวเบื้องต้นมาแล้วในบทความ (How to start Artificial Intelligence – number and operator) และลิสต์เป็นโครงสร้างของภาษา “lisp” ที่ต้องอยู่ภายใน () โดยมีสมาชิกเป็น atom ชนิดต่าง หรือเป็นลิสต์ย่อย หรือเป็น () ว่าง ๆ ที่เรียกว่าลิสต์ว่าง (empty list) ลัษณะของ list จึงคล้ายกับ array เพราะฉะนั้นจึงมีฟังก์ชันที่สำคัญดังนี้

  • สร้าง list: quote, list
  • เพิ่ม list: cons
  • ต่อ list: append
  • เข้าถึงข้อมูลใน list: car, cdr, first, rest, last, butlast, nth
  • หาความยาว list: length
  • กลับลำดับของ list: reverse


ขั้นตอน (Steps)

  1. สร้าง list: quote, list: ฟังก์ชัน (quote (x y z)) สามารถใช้ ‘ แทนได้ซึ่งให้ผลไม่ต่างกับ (list ‘x ‘y ‘z)
      i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
      I I I I I I I      8     8   8           8     8     o  8    8
      I  \ `+' /  I      8         8           8     8        8    8
       \  `-+-'  /       8         8           8      ooooo   8oooo
        `-__|__-'        8         8           8           8  8
            |            8     o   8           8     o     8  8
      ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8
    
    Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/>
    
    Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
    Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
    Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
    Copyright (c) Bruno Haible, Sam Steingold 1999-2000
    Copyright (c) Sam Steingold, Bruno Haible 2001-2010
    
    Type :h and hit Enter for context help.
    
    [1]> (quote (x y z))
    (X Y Z)
    [2]> '(x y z)
    (X Y Z)
    [3]> (list 'x 'y 'z)
    (X Y Z)
    
  2. เมื่อเราสร้าง “list” ได้แล้วก็สามารถเพิ่ม “atom” หรือ “list” เข้าไปใน “list” ได้เช่นกัน โดยมีโครงสร้างฟังก์ชันดังนี้ (cons x1 x2) โดย x1 อาจเป็น atom หรือ “list” แต่ x2 ต้องเป็น “list” เท่านั้น
    [4]> (setq list-1 '(x y z))
    (X Y Z)
    [5]> list-1
    (X Y Z)
    [6]> (cons 'a list-1)
    (A X Y Z)
    [7]> (cons '(a b c) list-1)
    ((A B C) X Y Z)
    
  3. ฟังก์ชัน (append list1 list2 listn) คล้ายกับ (cons atom/list list) ที่ใช้สำหรับเพิ่ม “list” เข้าไปใน “list” แต่จำนวนอาร์กิวเมนต์จะมีเท่าไหร่ก็ได้ซึ่งต่างกับ cons จะมีเพียงแค่ 2 เท่านั้น
    [8]> (cons 'a '(x y z))
    (A X Y Z)
    [9]> (append '(a) '(x y z) '(b))
    (A X Y Z B)
    
  4. อย่างไรก็ตามฟังก์ชันสร้าง list (list list1 list2 listn) และต่อ list (append list1 list2 listn) ต่างกันดังตัวอย่างดังต่อไปนี้
    [10]> (list '(x) '(y) '(z))
    ((X) (Y) (Z))
    [11]> (append '(x) '(y) '(z))
    (X Y Z)
    
  5. การเข้าถึง “list” มีหลายรูปแบบเราแถบไม่ต้องเขียนโปรแกรมอะไรเพิ่มเลยเพราะมีฟังก์ชันสนับสนุนอยู่แล้ว ตัวอย่างฟังก์ชันก์แสนประหลาดคือ
    • car: ดึง atom แรกของ list ออกมา
    • cdr: ดึง list ที่เหลือหลักตัด atom แรกออกไป
    [12]> (car '(x y z))
    X
    [13]> (cdr '(x y z))
    (Y Z)
    

    โดยตัวฟังก์ชันสามารถซ้อนกันได้เช่น caar caaar cadr เป็นต้น

    [14]> (caar '((x) y z))
    X
    [15]> (cdar '((x b) y z))
    (B)
    [16]> (cadr '(x y z))
    Y
    
  6. ฟังก์ชันอื่น ๆ สำหรับเข้าถึง list ดังนี้
    [1]> (setq list-1 '(a b c d e (f) g h i j))
    (A B C D E (F) G H I J)
    [2]> list-1
    (A B C D E (F) G H I J)
    [3]> (first list-1)
    A
    [4]> (rest list-1)
    (B C D E (F) G H I J)
    [5]> (last list-1)
    (J)
    [6]> (butlast list-1)
    (A B C D E (F) G H I)
    [7]> (butlast list-1 3)
    (A B C D E (F) G)
    [8]> (nth list-1 3)
    
    *** - NTH: (A B C D E (F) G H I J) is not a non-negative integer
    The following restarts are available:
    USE-VALUE      :R1      Input a value to be used instead.
    ABORT          :R2      Abort main loop
    Break 1 [9]> (nth 3 list-1)
    D
    
  7. การหาความยาว list
    [1]> (length '(a b c (d) e))
    5
    
  8. การกลับลำดับของ list
    [2]> (reverse '(a b c (d) e))
    (E (D) C B A)
    

ใส่ความเห็น