학습 Pilog - 5: 목록
4781 단어 prologlispfunctionalpicolisp
이 게시물은 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
와 같은지 확인하기만 합니다. @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
Reference
이 문제에 관하여(학습 Pilog - 5: 목록), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/miatemma/learning-pilog-5-lists-1akf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)