日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

邏輯編程:上古人工智能語言Prolog

來源: 責(zé)編: 時間:2024-01-02 09:29:34 185觀看
導(dǎo)讀今天給大家介紹一種有趣的編程語言。它能夠讓計算機(jī)像偵探一樣推理,像哲學(xué)家一樣思考,這就是邏輯編程。邏輯編程就好比我們給計算機(jī)一個邏輯謎題,然后他通過一系列的推理,找到答案。1 邏輯編程是什么?1.1 邏輯編程的定義與

今天給大家介紹一種有趣的編程語言。3bU28資訊網(wǎng)——每日最新資訊28at.com

它能夠讓計算機(jī)像偵探一樣推理,像哲學(xué)家一樣思考,這就是邏輯編程。3bU28資訊網(wǎng)——每日最新資訊28at.com

邏輯編程就好比我們給計算機(jī)一個邏輯謎題,然后他通過一系列的推理,找到答案。3bU28資訊網(wǎng)——每日最新資訊28at.com

1 邏輯編程是什么?

1.1 邏輯編程的定義與特點

想象一下,如果我們可以讓計算機(jī)像人類一樣思考和解決問題,那會是怎樣的情景?邏輯編程就是這樣一種嘗試,它利用邏輯學(xué)的原理,使計算機(jī)能夠進(jìn)行推理和解決問題。3bU28資訊網(wǎng)——每日最新資訊28at.com

我們只需要告訴計算機(jī):“這是規(guī)則,這是事實,現(xiàn)在你告訴我答案。” 就像玩一個連環(huán)推理的游戲,每個線索都逐漸揭開謎題的一部分,最終揭示出整個故事。3bU28資訊網(wǎng)——每日最新資訊28at.com

邏輯編程的特點是高度抽象,不關(guān)注如何操作,而是關(guān)注“什么是真的”。3bU28資訊網(wǎng)——每日最新資訊28at.com

1.2 代表語言:Prolog

Prolog,即Programming in Logic,是邏輯編程的一種代表性語言。它的核心是事實和規(guī)則。讓我們來看一下Prolog的基本語法:3bU28資訊網(wǎng)——每日最新資訊28at.com

  • 事實:在Prolog中,我們可以定義一些基本的事實。例如,philosopher(socrates). 表示“蘇格拉底是哲學(xué)家”。
  • 規(guī)則:規(guī)則用于定義事實之間的關(guān)系。例如,mortal(X) :- philosopher(X). 表示“如果某人是哲學(xué)家,那么他必然是凡人”。X表示參數(shù),大寫的是變量,小寫的是常量。符號 :- 表示推理關(guān)系,如果右邊的表達(dá)式成立,左邊的表達(dá)式也成立。
  • 查詢:查詢是向Prolog程序提出的問題。例如,?- mortal(socrates). 將詢問“蘇格拉底是凡人嗎?”。?-是命令提示符,我們在后邊輸入要執(zhí)行的命令,回車后執(zhí)行并返回結(jié)果。

注意所有語句的最后都用一個點(.)表示結(jié)束。3bU28資訊網(wǎng)——每日最新資訊28at.com

Prolog的魅力在于它的簡潔和強(qiáng)大。我們不需要告訴計算機(jī)如何一步步解決問題,只需告訴它規(guī)則和事實,它就能自動進(jìn)行邏輯推理,最終給我們答案。3bU28資訊網(wǎng)——每日最新資訊28at.com

2 邏輯編程的應(yīng)用領(lǐng)域

2.1 專家系統(tǒng)

專家系統(tǒng)是邏輯編程的一大應(yīng)用,就像是擁有了一個專家顧問團(tuán)隊。它們可以幫助醫(yī)生診斷疾病,或者幫助工程師設(shè)計復(fù)雜的機(jī)械結(jié)構(gòu)。以醫(yī)療診斷為例,在Prolog中,我們可以定義一系列的癥狀和疾病之間的關(guān)系。例如:3bU28資訊網(wǎng)——每日最新資訊28at.com

disease(flu) :- symptom(fever), symptom(cough).

這條規(guī)則告訴計算機(jī):“如果一個人有發(fā)燒和咳嗽的癥狀,那么他可能得了流感。”通過這樣的規(guī)則,專家系統(tǒng)可以幫助醫(yī)生診斷疾病。3bU28資訊網(wǎng)——每日最新資訊28at.com

2.2 自然語言理解

自然語言理解讓計算機(jī)能夠理解人類的語言。就像是給計算機(jī)裝上了一副懂得人類語言的眼鏡,它可以讀懂你的郵件,理解你的指令。例如,我們可以用Prolog來解析句子的結(jié)構(gòu):3bU28資訊網(wǎng)——每日最新資訊28at.com

sentence(Subject, Verb, Object) :- noun(Subject), verb(Verb), noun(Object).

這條規(guī)則可以幫助計算機(jī)理解“主語 + 謂語 + 賓語”的句子結(jié)構(gòu)。通過這種方式,計算機(jī)可以更好地理解用戶的輸入。3bU28資訊網(wǎng)——每日最新資訊28at.com

2.3 智能知識庫

智能知識庫就像是一個巨大的電子大腦,存儲著海量的信息。邏輯編程讓這個大腦可以自己思考和推理,幫助我們從中找到需要的知識。例如,一個關(guān)于歷史人物的知識庫可能包含如下規(guī)則:3bU28資訊網(wǎng)——每日最新資訊28at.com

born_in(bruce_lee, san_francisco).performed(bruce_lee, the_game_of_death).

通過這樣的事實和規(guī)則,用戶可以查詢李小龍的出生地和參演過哪些電影。3bU28資訊網(wǎng)——每日最新資訊28at.com

3 邏輯編程如何解決問題?

3.1 建立模型

解決問題的第一步是建立一個模型。就像是搭建一座橋梁,我們需要定義橋梁的結(jié)構(gòu)和支撐點。在邏輯編程中,我們定義規(guī)則或限制條件,比如:“哲學(xué)家是凡人。”3bU28資訊網(wǎng)——每日最新資訊28at.com

mortal(X) :- philosopher(X).

3.2 定義規(guī)則與事實

接下來,我們在模型上添加規(guī)則和事實。如果說模型是橋梁的結(jié)構(gòu),那么規(guī)則和事實就像是橋梁上行駛的車輛。例如,我們聲明:“蘇格拉底、柏拉圖、亞里士多德是哲學(xué)家。”3bU28資訊網(wǎng)——每日最新資訊28at.com

philosopher(socrates).philosopher(plato).philosopher(aristotle).

3.3 推導(dǎo)與求解

最后,我們提出問題,比如:“誰是凡人?”邏輯編程像是一個聰明的小偵探,它會自動推導(dǎo)邏輯,找出所有可能的答案,比如輸出:“蘇格拉底、柏拉圖、亞里士多德。”3bU28資訊網(wǎng)——每日最新資訊28at.com

Prolog 有很多實現(xiàn),本文以目前比較活躍的 SWI-Prolog 為例運行這個程序。3bU28資訊網(wǎng)——每日最新資訊28at.com

需要先把規(guī)則和事實保存到一個文件中 mortal.pl,然后使用命令 consult 加載規(guī)則,最后執(zhí)行 mortal(X). 獲取結(jié)果,有多個答案時,我們輸入分號(;),Prolog會繼續(xù)搜索直到所有可能的答案都被找到。3bU28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片3bU28資訊網(wǎng)——每日最新資訊28at.com

SWI-Prolog官方網(wǎng)站:https://www.swi-prolog.org/3bU28資訊網(wǎng)——每日最新資訊28at.com

可執(zhí)行程序:https://www.swi-prolog.org/download/stable3bU28資訊網(wǎng)——每日最新資訊28at.com

Docker鏡像:https://hub.docker.com/_/swipl/3bU28資訊網(wǎng)——每日最新資訊28at.com

源碼:https://github.com/SWI-Prolog/swipl-devel3bU28資訊網(wǎng)——每日最新資訊28at.com

4 邏輯編程的常見問題與解決方法

4.1 地圖著色問題

想象一下你有一張地圖,你需要用不同的顏色給每個區(qū)域上色,但相鄰區(qū)域不能是同一種顏色。3bU28資訊網(wǎng)——每日最新資訊28at.com

(圖片和解題方法來源:https://ruanyifeng.com/blog/2019/01/prolog.html)3bU28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片3bU28資訊網(wǎng)——每日最新資訊28at.com

規(guī)則如下:3bU28資訊網(wǎng)——每日最新資訊28at.com

color(red).color(green).color(blue).color_solution(A,B,C,D,E) :-    color(A), color(B), color(C), color(D), color(E),    /+ A=B, /+ A=C, /+ A=D, /+ A=E,    /+ B=C, /+ C=D, /+ D=E.

如果右邊有多個條件,用逗號隔開;如果要用否定表達(dá)式,在表達(dá)式前加上 /+ 。3bU28資訊網(wǎng)——每日最新資訊28at.com

計算速度還是比較快的,執(zhí)行效果如下:3bU28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片3bU28資訊網(wǎng)——每日最新資訊28at.com

4.2 嫌疑人推理問題

當(dāng)一個偵探在解決一個案件時,他需要考慮所有嫌疑人的動機(jī)和證據(jù)。邏輯編程可以幫助偵探整理這些信息,推斷出真正的罪犯。3bU28資訊網(wǎng)——每日最新資訊28at.com

假設(shè)規(guī)則如下:3bU28資訊網(wǎng)——每日最新資訊28at.com

% 犯罪嫌疑人suspect(zhangsan).suspect(lisi).suspect(wangwu).% 犯罪發(fā)生在夜晚crime_occurred(night).% 無辜的innocent(Person) :- suspect(Person), not_at_scene(Person, Time), crime_occurred(Time).% 假設(shè)我們知道Alice和Charlie在犯罪發(fā)生時有不在場證明not_at_scene(zhangsan, night).not_at_scene(lisi, night).

我們按照規(guī)則和事實就可以求解誰是無辜的,誰不能排除嫌疑,演示效果如下:3bU28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片3bU28資訊網(wǎng)——每日最新資訊28at.com

4.3 尋找近似最優(yōu)解

有時候,問題可能沒有一個完美的解決方案,求解最優(yōu)解的成本很高,我們找一個近似解就可以了。這里以背包問題(Knapsack Problem)舉個例子,在這個問題中,我們需要在不超過背包重量限制的情況下,盡可能多地裝入價值總和最大的物品。3bU28資訊網(wǎng)——每日最新資訊28at.com

假設(shè)我們有一系列物品,每個物品有重量和價值,以及一個背包的最大重量限制。這段代碼比較復(fù)雜,也有更好的解決方案,有興趣的可以研究下。3bU28資訊網(wǎng)——每日最新資訊28at.com

% 物品列表:item(物品ID, 價值, 重量).item(1, 15, 20).item(2, 20, 30).item(3, 15, 25).item(4, 22, 25).% 背包最大重量限制max_weight(50).% 檢查物品組合是否超過最大重量within_weight_limit(Items, MaxWeight) :-    total_weight(Items, TotalWeight), %通過調(diào)用total_weight計算物品重量    TotalWeight =< MaxWeight.% 計算物品組合的總重量,這里是一個遞歸規(guī)則。% 它分兩種情況:一個是空列表的總重量為0,另一個是包含至少一個物品的列表。% 對于非空列表,它計算列表頭部物品的重量,然后遞歸地計算列表剩余部分的總重量,最后將兩者相加。total_weight([], 0).total_weight([Item|Rest], TotalWeight) :-    item(Item, _, ItemWeight),    total_weight(Rest, RestWeight),    TotalWeight is ItemWeight + RestWeight.% 計算物品組合的總價值,這也是一個遞歸規(guī)則total_value([], 0).total_value([Item|Rest], TotalValue) :-    item(Item, ItemValue, _),    total_value(Rest, RestValue),    TotalValue is ItemValue + RestValue.% 暴力搜索所有的組合,可以看作是一種深度優(yōu)先搜索% max_weight把背包的最大容量取出來% findall是Prolog內(nèi)置的,把所有物品的Id取出來% subset把所有物品的組合取出來,定義見下方,結(jié)果將被綁定到變量Solution% within_weight_limit 判斷方案是否在重量限制中% 如果Solution的總重量在限制范圍內(nèi),這個調(diào)用會計算其總價值并將其綁定到變量Value。iterative_deepening_knapsack(Solution, Value) :-    max_weight(MaxWeight),    findall(Item, item(Item, _, _), AllItems),    subset(AllItems, Solution),    within_weight_limit(Solution, MaxWeight),    total_value(Solution, Value).% 用于查找所有可能組合(子集),這也是一個遞歸定義% 空列表是其自身的子集。% 如果列表的頭部是E,并且Tail的一個子集是NTail,那么添加E到NTail的頭部形成的列表也是原始列表的一個子集。這條規(guī)則包含列表中的第一個元素。% 無論列表的頭部是什么(這里用匿名變量_表示),Tail的一個子集NTail也是原始列表的一個子集。這條規(guī)則不包含列表中的第一個元素。subset([], []). subset([E|Tail], [E|NTail]):- subset(Tail, NTail).subset([_|Tail], NTail):- subset(Tail, NTail).% 尋找近似最優(yōu)解% 使用findall運行iterative_deepening_knapsack 來收集所有解決方案的價值% 使用max_list找到最高的價值% 再次運行iterative_deepening_knapsack來找到與最高價值對應(yīng)的物品組合% 返回最高價值A(chǔ)pproxValue和對應(yīng)的物品組合ApproxItems作為查詢結(jié)。approximate_solution(ApproxValue, ApproxItems) :-    findall(Value, iterative_deepening_knapsack(_, Value), Values),    max_list(Values, ApproxValue),    iterative_deepening_knapsack(ApproxItems, ApproxValue).

實際運行效果如下:3bU28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片3bU28資訊網(wǎng)——每日最新資訊28at.com

結(jié)語

邏輯編程語言歷史悠久,通常用于教育、研究和某些專業(yè)應(yīng)用領(lǐng)域,如人工智能、知識表示、自然語言處理、專家系統(tǒng)等,但是我們?nèi)粘S玫暮苌伲饕且驗樗男阅懿惶茫覍W(xué)習(xí)曲線比較陡峭,業(yè)界的接受程度不太高。3bU28資訊網(wǎng)——每日最新資訊28at.com

不過在人工智能中,其表示知識和推理方面的能力還是不錯的,未來或許可以和命令式、函數(shù)式編程范式更多的結(jié)合,從而提供更加強(qiáng)大和靈活的編程工具。3bU28資訊網(wǎng)——每日最新資訊28at.com

最后,邏輯編程就像是賦予了計算機(jī)一種思考能力,有興趣的可以一起學(xué)習(xí)下。3bU28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-55036-0.html邏輯編程:上古人工智能語言Prolog

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 蛻變之始,useEffect 最后一種用法

下一篇: Vue.js 3.4版本發(fā)布:解析速度提升兩倍,雙向綁定等新功能

標(biāo)簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 海淀区| 昆山市| 天长市| 阿图什市| 石景山区| 四子王旗| 梅州市| 枞阳县| 辽阳县| 本溪市| 临朐县| 鄂托克前旗| 浪卡子县| 平度市| 呼玛县| 商丘市| 昌黎县| 密云县| 凤庆县| 海南省| 波密县| 大足县| 江华| 新郑市| 上思县| 凉山| 石家庄市| 山东| 江永县| 聂拉木县| 响水县| 苍山县| 崇义县| 东源县| 利川市| 鄱阳县| 新和县| 江口县| 永春县| 丰台区| 巫山县|