Fakultas Ilmu Komputer UI

Skip to content
Snippets Groups Projects
Commit b0a9871d authored by Muhammad Rifqi's avatar Muhammad Rifqi
Browse files

Update README.md

parent a1739772
No related branches found
No related tags found
No related merge requests found
Lambda Calculus REPL:
Tugas 5 Functional Programming - Muhammad Rifqi (1806205621)
====================
A simple REPL for lambda calculus.
Source Code yang dimodifikasi: [Lambda Calculus REPL - Ema93sh](https://github.com/Ema93sh/lambda-calculus-interpreter)
Original README.md: [lambda-calculus-interpreter/README.md](https://github.com/Ema93sh/lambda-calculus-interpreter/blob/master/README.md)
## Run
## Screencast
Untuk menjalankan program, ketik perintah berikut pada terminal:
![Screencapture GIF](screencast.gif)
cabal run
## Modifikasi yang dilakukan:
## Run
Saya menambahkan beberapa baris handling input dan fungsi baru pada file Main.hs, sehingga program dapat menginterpretasikan bilangan ke bentuk lambda calculus dan juga dapat menangani operasi penjumlahan ataupun perkalian. Berikut beberapa bagian yang saya tambahkan:
To run the REPL, just type in:
Fungsi interpret yang memeriksa apakah input yang diterima berupa bilangan atau operator ('+','*'). Juga fungsi strToInt yang akan membaca sebuah String sebagai Integer.
cabal run
interpret :: String -> String
interpret e = if all (`elem` "0123456789") e
then do churchNumeral e
else if all (`elem` "+*") e
then do operator e
else ":cn hanya dapat menerjemahkan bilangan integer, '+', dan '*'"
strToInt :: String -> Integer
strToInt s = read s :: Integer
Fungsi churchNumeral yang menginterpretasikan bilangan ke bentuk lambda calculus, fungsi dapat menerima input berupa angka yang lebih dari 1 digit karena proses interpretasi dilakukan secara rekursif.
churchNumeral :: String -> String
churchNumeral n = "λsz." ++ numeral (strToInt n)
numeral :: Integer -> String
numeral 0 = "z"
numeral 1 = "s(z)"
numeral n = "s" ++ "(" ++ numeral (n-1) ++ ")"
Fungsi operator yang menginterpretasikan '+' dan '*' ke bentuk lambda calculus.
operator :: String -> String
operator "+" = "λwyx.y(wyx)"
operator "*" = "λxyz.x(yz)"
Fungsi operate yang menginterpretasikan input berupa operasi penjumlahan ataupun perkalian antara 2 bilangan (masing-masingnya akan diinterpretasikan dengan fungsi yang telah ditulis sebelumnya). Sehingga tersusun suatu lambda calculus yang siap untuk di evaluasi.
operate :: String -> String -> String -> String
operate e1 op e2 = case op of
"+" -> "(" ++ churchNumeral e1 ++ ")" ++
"(" ++ operator op ++ ")" ++
"(" ++ churchNumeral e2 ++ ")"
## Examples:
"*" -> "(" ++ operator op ++ ")" ++
"(" ++ churchNumeral e1 ++ ")" ++
"(" ++ churchNumeral e2 ++ ")"
To switch normal order reduction strategy
:n
(λx.xx)((λxy.yx)y)
→(λx.xx)((λxy.yx)y)
→((λxy.yx)y)((λxy.yx)y)
→(λa.ay)((λxy.yx)y)
→((λxy.yx)y)y
→(λa.ay)y
yy
## Cara Penggunaan
:a
(λx.xx)((λxy.yx)y)
→(\x.xx)((λxy.yx)y)
→(λx.xx)(λa.ay)
yy
Untuk menginterpretasikan bilangan atau operator ('+' dan '*'), ketik perintah berikut:
-- Alpha Equivalence
:eq (\x.xx) (\y.yy)
:eq (\xy.xy) (\yx.yx)
:eq (\xy.xy) (\yx.yy)
:cn <bilangan/operator>
Contoh:
:cn 3
:cn *
-- Convert to Debruijn Index
:d (\xysz.xs(ysz))
:d (\x.x(\y.xx))
Untuk mengevaluasi operasi penambahan atau perkalian, ketik perintah berikut:
-- Explain
(λx.(λy.xy))y (\x.xx)
:cn <bilangan1> <operator> <bilangan 2>
Contoh:
:cn 1 + 2
:cn 5 * 5
TODO
:eq y x not equal
Catatan: Perhatikan penggunaan spasi, bilangan dan operator harus dipisahkan dengan spasi.
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment