邏輯程式設計與函式程式設計的介紹
學習關係正規化最重要原因是因為它有趣。
swannodette/logic-tutorial提供了在Clojure 下學習邏輯程式設計的開源專案。
準備:
鍵入lein repl或cake repl
進入Cojure提示介面,輸入:
user=> (require 'clojure.core.logic)
user=> (load "logic_tutorial/tut1")
user=> (in-ns 'logic-tutorial.tut1)
這樣就準備好了環境。
關係程式設計是問計算機問題,在問問題之前,我們需要計算機瞭解一些事實,比如男人。
tut1=> (defrel man x)
#'tut1/man
然後定義幾個不同名字的人:
tut1=> (fact man 'Bob)
nil
tut1=> (fact man 'John)
nil
然後我們就可以提問男人是誰?問問題使用run,希望計算機將可能的答案給q:
tut1=> (run 1 [q] (man q))
(John)
我們剛才問了只有一個答案的問題,可以問超多個答案的問題:
tut1=> (run 2 [q] (man q))
(John Bob)
如果問更多呢?
tut1=> (run 3 [q] (man q))
(John Bob)
同樣回答。這是因為我們已經告訴計算機這個世界上有兩個男人,它不能給我們它不知道的。
下面讓我們定義另外一種關係和事實:
tut1=> (defrel fun x)
#'tut1/fun
tut1=> (fact fun 'Bob)
nil
問一個新問題:
tut1=> (run* [q] (man q) (fun q))
(Bob)
我們使用run*,這意味著所有這個問題的答案都會出現,問題是:誰是男人而且有趣。
再定義新的:
tut1=> (defrel woman x)
#'tut1/woman
tut1=> (fact woman 'Lucy)
nil
tut1=> (fact woman 'Mary)
nil
tut1=> (defrel likes x y)
#'tut1/likes
關係不一定有關單個實體,可以在事情之間定義關係:
tut1=> (fact likes 'Bob 'Mary)
nil
tut1=> (fact likes 'John 'Lucy)
nil
tut1=> (run* [q] (likes 'Bob q))
(Mary)
我們可以問誰喜歡誰這樣的關係問題。
tut1=> (run* [q] (likes 'Mary q))
()
卻沒有答案,因為我們沒有說過Mary被誰喜歡,只有“Bob喜歡Mary”。
看看:
tut1=> (fact likes 'Mary 'Bob)
nil
tut1=> (run* [q] (fresh [x y] (likes x y) (== q [x y])))
([Mary Bob] [Bob Mary] [John Lucy])
這裡fresh是 Clojure vector類似陣列,存放誰喜歡誰很多可能值。
再看看:
tut1=> (run* [q] (fresh [x y] (likes x y) (likes y x) (== q [x y])))
([Mary Bob] [Bob Mary])
只列出誰彼此喜歡的人。
完,有興趣者可進入專案主頁繼續學習研究。
相關文章
- 函式程式設計基本原理介紹函式程式設計
- JavaScript 函數語言程式設計介紹JavaScript函數程式設計
- 函式程式設計函式程式設計
- NIO程式設計介紹程式設計
- 如何向新手程式設計師介紹程式設計?程式設計師
- 當邏輯程式設計遭遇CQRS時程式設計
- 程式設計師面試邏輯題解析程式設計師面試
- Shell程式設計 --- Shell介紹程式設計
- Delphi COM程式設計介紹程式設計
- scala 函式程式設計函式程式設計
- 函式程式設計之道函式程式設計
- 不用任何賦值的程式設計稱為*函式式*程式設計賦值程式設計函式
- 從程式設計師到架構師的方法與邏輯程式設計師架構
- Scala函式與函數語言程式設計函式函數程式設計
- javascript函數語言程式設計簡單介紹JavaScript函數程式設計
- 函數語言程式設計實用介紹(下)函數程式設計
- 函數語言程式設計實用介紹(上)函數程式設計
- JavaScript函數語言程式設計之pointfree與宣告式程式設計JavaScript函數程式設計
- 函數語言程式設計-鏈式程式設計RAC函數程式設計
- 函式響應式程式設計與RxSwift函式程式設計Swift
- [02] 多執行緒邏輯程式設計執行緒程式設計
- Linux網路程式設計--初等網路函式介紹(TCP)(轉)Linux程式設計函式TCP
- 介紹Java Socket程式設計的文章Java程式設計
- HTML5與WebGL程式設計(1):介紹HTMLWeb程式設計
- MATLAB 超程式設計介紹Matlab程式設計
- 計算機程式的思維邏輯 (11) - 初識函式計算機函式
- 【趣解程式設計】函式程式設計函式
- Windows 程式設計常用函式Windows程式設計函式
- iOS鏈式程式設計及函數語言程式設計iOS程式設計函數
- 計算機程式的思維邏輯 (94) – 組合式非同步程式設計計算機非同步程式設計
- 計算機程式的思維邏輯 (94) - 組合式非同步程式設計計算機非同步程式設計
- 程式設計師需要了解的邏輯學思想程式設計師
- 提高程式設計邏輯的7種方法 - DEV程式設計dev
- 物件導向與函式程式設計的比較物件函式程式設計
- 揚帆起航:從指令式程式設計到函式響應式程式設計程式設計函式
- 邏輯式程式語言極簡實現(使用C#) - 1. 邏輯式程式語言介紹C#
- Erlang/Elixir 中的 OTP 程式設計介紹程式設計
- 【JAVA程式設計】實驗三 函式與物件Java程式設計函式物件