推理式編程
『壹』 什麼是邏輯語言
Prolog(Programming in logic)是一種面向演繹推理的邏輯型程序設計語言,最早於1972年由柯爾麥倫納(Colmeraner)及其研究小組在法國馬賽大學提出。[1]
高濟,何欽銘著,人工智慧基礎 (第二版),高等教育出版社,2008.10,第67頁
中文名
邏輯編程語言
外文名
Programming in logic
簡稱
Prolog
定義
面向演繹推理的邏輯型語言
提出時間
1972年
關於邏輯編程語言
Prolog以處理一階謂詞演算為背景,由於其簡單的文法、豐富的表達力和獨特的非過程語言的特點,很適合用來表示人類的思維和推理規則,從而一問世就贏得了人工智慧研究和應用開發者的廣泛興趣。尤其在西歐和日本,Prolog語言已推廣應用於許多應用領域,如關系資料庫、數理邏輯、抽象問題求解、自然語言理解和專家系統等。日本還在其於1979年提出的第五代計算機研究計劃中把Prolog列為核心語言。
Prolog實際上就是一種基於逆向規則的演繹推理技術,只不過對規則和目標的表示有嚴格的限制.再加上演繹推理控制機制自身的簡單性,難以適用於復雜的應用域。[1]
Prolog語言的基本概念
Prolog語言的基本成分是Horn子句,表示為如下形式:
∧
∧
∧
p;
Prolog語言中,Horn子句以3種形式去分別表示逆向演繹推理中問題求解描述的3個部分:目標、規則和事實。
目標
表示為只有左部的Horn子句:
∧
∧
∧
;
即在Prolog語言中,目標公式只限於表示為原子公式的合取,而不能是任意的文字與或形。
規則
表示為典型的Horn子句:
∧
∧
∧
p
這就是逆向演繹推理所使用的規范化B規則,只是規則左部限定為原子公式的合取,而非任意文字與或形。
事實
事實表示為事實元素的集合,每個事實元素表示為只有右部的Horn子句,即單一原子公式P。事實元素間隱含合取關系。
只要用Prolog語言表示問題描述的這3個部分,支持Prolog語句的推理機制就會自動執行基於規則的逆向演繹推理,並最終給出。
『貳』 怎樣培養編程思維方式和邏輯推理
對於計算機編程思維方式和邏輯推理的培養,首先你應該經常找些經典的代碼案例進行研究並思考,然後去感受別人對著中處理方法的好處。然後你可以搜些有趣的問題(如考試比賽中遇到的代碼分析題)進行嘗試處理,經常做的話就好了。
『叄』 未來比較有前景的8種編程語言,看看有沒有你已經掌握的
目前,軟體開發人員正在使用大量不同的編程語言,大多數工作需要熟悉很多技能,如java、Java、PHP和C#。然而,隨著軟體需求的發展,新的和尚未被普遍接受的編程語言越來越突出,為程序員提供了針對某些工作的正確工具。
預測哪些語言最終會上升到編程語言排行榜的頂部是困難的,很多語言的受歡迎指數都呈上升趨勢,以下是八種目前還沒有大火的編程語言競爭力分析,看起來未來幾年將在在企業中發揮巨大作用。(排名按照開源社區受歡迎程度,swift最受歡迎)
在2014年的蘋果WWDC大會上首次亮相,旨在替代OSX和iOS開發的Objective-C語言。蘋果於2015年12月,根據Apache許可證開源了該語言,這意味著所有源代碼都可以編輯,程序可以在不歸屬於蘋果的情況下運行。
RedMonk分析師Stephen O'Grady表示,Swift與Ruby和Python這些更現代的語言相似,自發布以來一直享受著高速增長。蘋果公司表示: Swift採用安全的編程模式,並添加了現代功能,使編程更容易、更靈活、更有趣。
Github上Star:39.8K
這種開源語言被視為比較成熟的語言(如Java和C)更快速、更易於使用。它已被許多企業使用:BBC、SoundCloud,Facebook以及英國政府獲獎的GOV.UK網站。
Type在年初開始普及,上半年保持著強勁的增長勢頭。這反映在其技術出版商RedMonk的排名中,在第一季度Github的排名中位列17位,其中Erlang和Rust並列。
被描述為「Java的超集」,Type最大的優點就是程序員可以利用Angular,這是一個用於創建以Type編寫Web應用程序的框架。
Github上Star:24.6K
由Mozilla創建,Rust 1.0於2014年發布,已經開發了多年。
與C和C ++在某些方面類似,Mozilla將其描述為一種專注於性能、並行化和內存安全的新型編程語言。通過從零開始構建語言並結合現代編程語言設計的元素,Rust的創建者避免了傳統語言必須處理大量」baggage「(向後兼容性要求)。經過一段時間的發展,該語言正在引起程序員的興趣。
Github上Star:22.9K
快速編譯並與Java一起運行,Kotlin是一種靜態類型的編程語言,可在Java虛擬機上運行,可編譯為Java源代碼。
由俄羅斯軟體開發公司JetBrains創建,Kotlin正在Pinterest,Evernote,Uber和Coursera上使用。
Github上Star:16.6k
Clojure於2009年推出,是Lisp編程語言的一種方言。它是一種強調函數式編程的通用語言。它將代碼視為數據,並具有宏系統,如其他「Lisps」。
它被成功應用到沃爾瑪、Puppet實驗室和各大軟體公司。
Github上Star:6.5k
Haskell將自己稱為「高級純函數式編程語言」,1990年發布了第一個版本。它具有類型推理系統,主要在學術界內使用,但有一些行業應用案例,例如AT&T,BAE Systems,Facebook甚至Google的項目。
2016年,開始編制2020版本。
Github上Star:681
R提供用於統計計算的開源軟體環境。
首先出現在1993年,R在數據驅動的職業之中,例如數據挖掘、統計學家甚至學者,受到了越來越多的歡迎。它提供了一個簡單有效的方式來分析數據,盡管它不能與像Hadoop這樣的大型架構相競爭。
普通程序員目前對R語言的接受程度一般,隨著大數據以及人工智慧的發展,R語言未來的發展前景還是很不錯的。
Github上Star:240
『肆』 為什麼有的人連OO、FP等基本的語言概念都搞不清楚,卻整天吹噓OO/FP的好處
先科普一下什麼是OO什麼是FP
OO:
OO(Object Oriented,面向對象)是當前計算機界關心的重點,它是90年代軟體開發方法的主流。面向對象的概念和應用已超越了程序設計和軟體開發,擴展到很寬的范圍。如資料庫系統、互動式界面、應用結構、應用平台、分布式系統、網路管理結構、CAD技術、人工智慧等領域。
OO方法(Object-Oriented Method,面向對象方法,面向對象的方法)是一種把面向對象的思想應用於軟體開發過程中,指導開發活動的系統方法,簡稱OO (Object-Oriented)方法,是建立在「對象」概念基礎上的方法學。對象是由數據和容許的操作組成的封裝體,與客觀實體有直接對應關系,一個對象類定義了具有相似性質的一組對象。而每繼承性是對具有層次關系的類的屬性和操作進行共享的一種方式。所謂面向對象就是基於對象概念,以對象為中心,以類和繼承為構造機制,來認識、理解、刻畫客觀世界和設計、構建相應的軟體系統。
FP:

人雲亦雲嘛,類似的例子太多了,什麼東西都有人吹
『伍』 程序設計主要有哪些方法
1、結構化程序設計
在結構化程序設計中,任何程序段的編寫都基於3種結構:分支結構、循環結構和順序結構。程序具有明顯的模塊化特徵,每個程序模塊具有惟一的出口和入口語句。結構化程序的結構簡單清晰,模塊化強,描述方式貼近人們習慣的推理式思維方式,因此可讀性強。
2、面向對象程序設計
面向對象程序設計方法是盡可能模擬人類的思維方式,使得軟體的開發方法與過程盡可能接近人類認識世界、解決現實問題的方法和過程,也即使得描述問題的問題空間與問題的解決方案空間在結構上盡可能一致,把客觀世界中的實體抽象為問題域中的對象。

程序設計的分類
1、按照結構性質,有結構化程序設計與非結構化程序設計之分。前者是指具有結構性的程序設計方法與過程。它具有由基本結構構成復雜結構的層次性,後者反之。
2、按照用戶的要求,有過程式程序設計與非過程式程序設計之分。前者是指使用過程式程序設計語言的程序設計,後者指非過程式程序設計語言的程序設計。
3、按照程序設計的成分性質,有順序程序設計、並發程序設計、並行程序設計、分布式程序設計之分。按照程序設計風格,有邏輯式程序設計、函數式程序設計、對象式程序設計之分。
『陸』 關於離散數學的編程問題(數理邏輯部分)
主要是要把合式公式抽象出來,然後用窮舉法每個賦值去試,如果合式公式為真值,這個賦值就滿足條件。
『柒』 Reactive(響應式)編程
Reactor 和Rxjava是Reactive Programming範例的一個具體實現,可以概括為:
作為反應式編程方向的第一步,Microsoft在.NET生態系統中創建了Reactive Extensions(Rx)庫。然後RxJava在JVM上實現了響應式編程。隨著時間的推移,通過Reactive Streams工作出現了Java的標准化,這一規范定義了JVM上的反應庫的一組介面和交互規則。它的介面已經在父類Flow下集成到Java 9中。
另外Java 8還引入了Stream,它旨在有效地處理數據流(包括原始類型),這些數據流可以在沒有延遲或很少延遲的情況下訪問。它是基於拉的,只能使用一次,缺少與時間相關的操作,並且可以執行並行計算,但無法指定要使用的線程池。但是它還沒有設計用於處理延遲操作,例如I / O操作。其所不支持的特性就是Reactor或RxJava等Reactive API的用武之地。
Reactor 或 Rxjava等反應性API也提供Java 8 Stream等運算符,但它們更適用於任何流序列(不僅僅是集合),並允許定義一個轉換操作的管道,該管道將應用於通過它的數據,這要歸功於方便的流暢API和使用lambdas。它們旨在處理同步或非同步操作,並允許您緩沖,合並,連接或對數據應用各種轉換。
首先考慮一下,為什麼需要這樣的非同步反應式編程庫?現代應用程序可以支持大量並發用戶,即使現代硬體的功能不斷提高,現代軟體的性能仍然是一個關鍵問題。
人們可以通過兩種方式來提高系統的能力:
通常,Java開發人員使用阻塞代碼編寫程序。這種做法很好,直到出現性能瓶頸,此時需要引入額外的線程。但是,資源利用率的這種擴展會很快引入爭用和並發問題。
更糟糕的是,會導致浪費資源。一旦程序涉及一些延遲(特別是I / O,例如資料庫請求或網路調用),資源就會被浪費,因為線程(或許多線程)現在處於空閑狀態,等待數據。
所以並行化方法不是靈丹妙葯,獲得硬體的全部功能是必要的。
第二種方法,尋求現有資源的更高的使用率,可以解決資源浪費問題。通過編寫非同步,非阻塞代碼,您可以使用相同的底層資源將執行切換到另一個活動任務,然後在非同步處理完成後返回到當前線程進行繼續處理。
但是如何在JVM上生成非同步代碼? Java提供了兩種非同步編程模型:
但是上面兩種方法都有局限性。首先多個callback難以組合在一起,很快導致代碼難以閱讀以及難以維護(稱為「Callback Hell」):
考慮下面一個例子:在用戶的UI上展示用戶喜歡的top 5個商品的詳細信息,如果不存在的話則調用推薦服務獲取5個;這個功能的實現需要三個服務支持:一個是獲取用戶喜歡的商品的ID的介面(userService.getFavorites),第二個是獲取商品詳情信息介面(favoriteService.getDetails),第三個是推薦商品與商品詳情的服務(suggestionService.getSuggestions),基於callback模式實現上面功能代碼如下:
如上為了實現該功能,我們寫了很多代碼,使用了大量callback,這些代碼比較晦澀難懂,並且存在代碼重復,下面我們使用Reactor來實現等價的功能:
future相比callback要好一些,但盡管CompletableFuture在Java 8上進行了改進,但它們仍然表現不佳。一起編排多個future是可行但是不容易的,它們不支持延遲計算(比如rxjava中的defer操作)和高級錯誤處理,例如下面例子。考慮另外一個例子:首先我們獲取一個id列表,然後根據id分別獲取對應的name和統計數據,然後組合每個id對應的name和統計數據為一個新的數據,最後輸出所有組合對的值,下面我們使用CompletableFuture來實現這個功能,以便保證整個過程是非同步的,並且每個id對應的處理是並發的:
Reactor本身提供了更多的開箱即用的操作符,使用Reactor來實現上面功能代碼如下:
如上代碼使用reactor方式編寫的代碼相比使用CompletableFuture實現相同功能來說,更簡潔,更通俗易懂。
可組合性,指的是編排多個非同步任務的能力,使用先前任務的結果作為後續任務的輸入或以fork-join方式執行多個任務。
編排任務的能力與代碼的可讀性和可維護性緊密相關。隨著非同步過程層數量和復雜性的增加,能夠編寫和讀取代碼變得越來越困難。正如我們所看到的,callback模型很簡單,但其主要缺點之一是,對於復雜的處理,您需要從回調執行回調,本身嵌套在另一個回調中,依此類推。那個混亂被稱為Callback Hell,正如你可以猜到的(或者從經驗中得知),這樣的代碼很難回歸並推理。
Reactor提供了豐富的組合選項,其中代碼反映了抽象過程的組織,並且所有內容通常都保持在同一級別(嵌套最小化)。
原材料可以經歷各種轉換和其他中間步驟,或者是將中間元素聚集在一起形成較大裝配線的一部分。如果在裝配線中某一點出現堵塞,受影響的工作站可向上游發出信號以限制原材料的向下流動。
雖然Reactive Streams規范根本沒有指定運算符,但Reactor或者rxjava等反應庫的最佳附加值之一是它們提供的豐富的運算符。這些涉及很多方面,從簡單的轉換和過濾到復雜的編排和錯誤處理。
在Reactor中,當您編寫Publisher鏈時,默認情況下數據不會啟動。相反,您可以創建非同步過程的抽象描述(這可以幫助重用和組合)。
上游傳播信號也用於實現背壓,我們在裝配線中將其描述為當工作站比上游工作站處理速度慢時向上游線路發送的反饋信號。
這將推模型轉換為推拉式混合模式,如果上游生產了很多元素,則下游可以從上游拉出n個元素。但是如果元素沒有準備好,就會在上游生產出元素後推數據到下游。
『捌』 少兒編程都學的什麼
少兒編程是主要是學習可視化圖形編程軟體的使用、簡單的編程知識,以及解決問題的能力。
可視化的圖形編程,就像搭積木一樣學習使用編程軟體,簡單地拖動和拼接積木,就可以創造出很多好玩的游戲、音樂或者美術作品等,用游戲啟蒙的方式激發孩子對編程的熱愛。
簡單的編程邏輯知識,比如條件判斷、順序執行、函數等,提高孩子的邏輯思維能力。
孩子通過編程做項目的過程,需要不斷思考、分析、製作和測試,不同於被動接受理論知識,孩子主動地學習掌握知識,提高解決問題的能力。
『玖』 目前比較主流的孩子可以學習的編程語言有哪些啊我家孩子6歲,想讓他接觸一下。
現在少兒編程主要學的是Scratch,它是由美國麻省理工學院設計開發的圖形化語言。Scratch的代碼輸入以滑鼠拖動模塊化的積木為主,減少鍵盤的使用,大部分的孩子都會喜歡。同時,Scratch編程語言也是哈佛大學推薦選修的少兒編程語言。
對於我們要面向的對象(8-12歲的少兒)來說,Scratch跳過了高級語言中那些繁難的概念和語法,用圖形化的表現和拖拽的交互來完成編程的核心邏輯和成果交付,既能解決學習曲線過於陡峭的問題,還能讓學習的過程不枯燥,並更及時地獲得結果反饋,非常適合他們這個年齡階段的心智水平和認知能力。
因此,在編程教育中,往往最早在「前運算階段」的後期,也就是6-7歲左右,並不會讓兒童直接接觸到邏輯和關系推理的概念。而是通過序列(Sequence)來讓兒童理解基本的因果關系。
同時,由於「具體運算階段」的兒童的思維只能映射到具體的事物上,所以高級編程語言中的抽象邏輯、語言和教學方法是很難為這個階段的兒童所接受。Scratch就很好地解決了這個問題。通過可視化的「積木」形式,兒童可以很輕松的編寫自己的游戲或者動畫書。在Scratch中,兒童很容易把具象的結果和程序所對應起來,這樣就很好的避免了高級編程語言如C、C++等低反饋的學習流程。
所以針對7-11歲的兒童,Scratch的可視化語言可以很好的幫助學生學習基本的邏輯、關系推理、數學的概念,同時避免過早的接觸到「形式運算階段」之後才能理解的抽象的演繹推理。
『拾』 什麼是程序邏輯
程序邏輯是描述和論證程序行為的邏輯,又稱霍爾邏輯。程序和邏輯有著本質的聯系。如果把程序看成一個執行過程,程序邏輯的基本方法是先給出建立程序和邏輯間聯系的形式化方法,然後建立程序邏輯系統,並在此系統中研究程序的各種性質。
簡介:
Hoare 邏輯(也叫做Floyd–Hoare 邏輯)是英國計算機科學家C. A. R. Hoare開發的形式系統,隨後為 Hoare 和其他研究者所精製。它發表於 Hoare 1969年的論文"計算機程序的公理基礎"中。這個系統的用途是為了使用嚴格的數理邏輯推理計算機程序的正確性提供一組邏輯規則。
Hoare 認可 Robert Floyd的早期貢獻,他為流程圖提供了類似的系統。
Hoare 邏輯的中心特徵是Hoare 三元組。這種三元組描述一段代碼的執行如何改變計算的狀態。Hoare 三元組有如下形式
{P}C{Q}這里的 P 和 Q 是斷言而 C 是命令。P 叫做前條件而 Q 叫做後條件。斷言是謂詞邏輯的公式。這個三元組在直覺上讀做: 只要 P 在 C 執行前的狀態下成立,則在執行之後 Q 也成立。注意如果 C 不終止,也就沒有"之後"了,所以 Q 在根本上可以是任何語句。實際上,你可以選擇 Q 為假來表達 C 不終止。
這叫做"部分正確"的。如果 C 終止並且在終止時 Q 是真,則表達式就是"全部正確"的。終止必須被單獨證明。
Hoare 邏輯為簡單的命令式編程語言的所有構造提供了公理和推理規則。除了給 Hoare 論文中的簡單語言的規則,其他語言構造的規則也已經被 Hoare 和很多其他研究者開發出來了。包括並發、過程、goto語句,和指針。
