학습 Pilog - 5: 목록

오늘 우리는 Pilog 프로그래밍에서 자주 사용되는 중요한 데이터 구조인 목록에 대해 이야기할 것입니다.

이 게시물은 this tutorial을 기반으로 합니다.


Pilog의 목록이란 무엇입니까?



기본적으로 PicoLisp: A sequence of elements와 동일합니다. 여기 몇 가지 예가 있어요.

(John Vincent Jules  Yolanda)
(John (robber Honey_Bunny) @X 2 John)
()
( () (dead z) (2 (b c)) () @Z (2 (b c))) 


(빈 목록()NIL 와 같습니다).

예제에서 우리는 다음을 배웁니다.
  • 목록 요소는 숫자( 2 ), 변수( @X , 복합 용어( (dead @Z )와 같은 데이터 구조의 혼합일 수 있습니다.
  • 목록에 중복된 값이 있을 수 있습니다.
  • 빈 목록은 여전히 ​​목록입니다.
  • 목록은 중첩될 수 있습니다: (2 (b c)) .



  • 목록은 내장 도트 연산자로 나눌 수 있습니다.. 기본적으로 목록을 첫 번째 요소인 헤드와 나머지 요소의 목록인 테일의 두 부분으로 나눕니다.

    : (? (equal (@X . @Y) (John Vincent Jules Yolanda)))
     @X=John @Y=(Vincent Jules Yolanda)
    -> NIL
    
    : (? (equal (@X . @Y) (John Vincent)))
     @X=John @Y=(Vincent)
    -> NIL
    


    보시다시피 목록의 꼬리는 내부에 단일 요소만 있더라도 항상 목록입니다. 그렇다면 빈 목록의 머리와 꼬리는 무엇입니까?

    : (? (equal (@X . @Y) ()))
    -> NIL
    


    빈 목록은 분할할 수 없습니다.


    그러나 항상 헤드와 테일을 분리할 필요는 없습니다. 추가로 사용자 정의할 수도 있습니다.

    : (? (equal (@X @Y . @W) (John Vincent Jules Yolanda)))
     @X=John @Y=Vincent @W=(Jules Yolanda)
    -> NIL
    


    이제 변수에 저장된 첫 번째 요소와 두 번째 요소가 있습니다.

    또는 세 번째 요소만 신경 쓰고 나머지는 모두 필요하지 않은 경우 익명 변수@를 사용할 수도 있습니다.

    : (? (equal (@ @ @Z . @) (John Vincent Jules Yolanda)))
     @Z=Jules
    -> NIL
    



    구성원 술어



    Pilog에는 member라는 내장 술어가 있으며 요소와 목록이라는 두 개의 인수를 사용합니다. 사용법은 매우 간단합니다.
  • 쿼리: john가 목록의 구성원입니까?

  • : (? (member John (John Vincent Jules Yolanda)))
    -> T
    



    해당 기능은 pilog.l 라이브러리 파일에 정의되어 있습니다.

    (be member (@X (@X . @)))
    (be member (@X (@ . @Y)) (member @X @Y))
    


    이 두 줄은 목록의 재귀 구조를 사용하여 요소가 구성원인지 여부를 확인합니다. 어떻게 작동합니까?
  • 첫 번째 줄은 첫 번째 목록 요소가 @X 와 같은지 확인하기만 합니다.
  • 두 번째 요소는 머리와 꼬리에서 목록을 분할합니다. 우리는 head가 @X가 아니라는 것을 알고 있습니다. 그렇지 않으면 첫 번째 줄 다음에 이미 T를 받았을 것입니다. 그래서 우리는 꼬리로 우리의 운을 시험해 볼 수 있습니다: member @X @Y) .



  • 예: 작은 번역기



    독일어와 영어로 된 1에서 9까지의 숫자가 있는 "사전"이 있다고 가정해 보겠습니다.

    (be tran (eins one))
    (be tran (zwei two))
    (be tran (drei three))
    (be tran (vier four))
    (be tran (fuenf five))
    (be tran (sechs six))
    (be tran (sieben seven))
    (be tran (acht eight))
    (be tran (neun nine))
    (be tran (zehn ten))
    


    독일어 숫자 단어 목록을 해당 영어 숫자 단어 목록으로 또는 그 반대로 변환하는 Pilog 스크립트를 작성해 봅시다. 구조는 다음과 같아야 합니다.
    (? (listtran (eins neun zwei) @X))@X = (one nine two)를 반환하고 (? (listtran (@X (one nine two)))@X=(eins zwei neun)를 반환해야 합니다.

    listtran 조건자를 구현해 보겠습니다. 기본 사례부터 시작합니다. 빈 목록의 번역 - 번역할 항목이 없으면 번역된 쪽도 비어 있습니다. 빈 목록은 NIL 와 동일합니다.

    (be listtran (NIL NIL))
    


    이제 정확히 하나의 항목이 있다고 가정해 보겠습니다(이는 목록의 헤드임을 의미합니다). 이 경우 위에서 정의한 tran 사전에서 찾아볼 수 있습니다.

    (be listtran ((@Hg . @Tg) (@He . @Te))
       (tran @Hg @He)
    

    @Hg/@Tg는 영어로 Head-German , Tail-German , @He/@Te를 나타냅니다.

    이제 첫 번째 목록 요소가 번역되었습니다. 우리가 해야 할 유일한 일은 나머지 목록이 비워질 때까지 목록을 따라 내려가는 것입니다.

    (be listtran (NIL NIL))
    
    (be listtran ((@Hg . @Tg) . (@He  . @Te))
       (tran @Hg @He)
       (listtran @Tg @Te) )
    


    그게 다야!

    : (? (listtran (eins zwei drei) @X))
     @X=(one two three)
    -> NIL
    


    완성된 스크립트는 this folder에서 찾을 수 있습니다.


    다음 포스팅에서는 중첩 리스트에 대한 재귀 패턴에 대해 공부하겠습니다.


    출처



  • http://www.let.rug.nl/bos/lpn//lpnpage.php?pagetype=html&pageid=lpn-htmlch4
  • 좋은 웹페이지 즐겨찾기