1. <track id="5jh9g"><ruby id="5jh9g"></ruby></track>

        深圳幻海軟件技術有限公司歡迎您!

        幻海優品

        AI與Python - 邏輯編程

        在本章中,我們將重點關注邏輯編程以及它如何幫助人工智能.

        我們已經知道邏輯是對正確推理原理的研究,或者簡單來說就是什么之后的研究.例如,如果兩個語句都為真,那么我們可以從中推斷出任何第三個語句.

        概念

        邏輯編程是兩個單詞的組合,邏輯和編程.邏輯編程是一種編程范例,其中問題通過程序語句表達為事實和規則,但在形式邏輯系統中.就像面向對象,功能,聲明和程序等其他編程范式一樣,它也是一種特殊的編程方法.

        如何解決邏輯編程問題

        邏輯編程使用事實和規則來解決問題.這就是為什么它們被稱為邏輯編程的構建塊.需要為邏輯編程中的每個程序指定一個目標.要理解如何在邏輯編程中解決問題,我們需要了解構建塊和減去;事實和規則 :

        事實

        實際上,每個邏輯程序都需要使用事實才能達到既定目標.事實基本上是關于程序和數據的真實陳述.例如,德里是印度的首都.

        規則

        實際上,規則是允許我們對問題域做出結論的約束.規則基本上寫成邏輯條款來表達各種事實.例如,如果我們正在構建任何游戲,則必須定義所有規則.

        規則對于解決邏輯編程中的任何問題非常重要.規則基本上是邏輯結論,可以表達事實.以下是規則和減號的語法;

        A: -  B1,B2,...,B n .

        這里,A是頭部,B1,B2,...... Bn是身體.

        例如 : 祖先(X,Y): - 父親(X,Y).

        祖先(X,Z): - 父親(X,Y),祖先(Y,Z).

        這可以理解為,對于每個X和Y,如果X是Y的父親而Y是Z的祖先,則X是Z的祖先.對于每個X和Y,X是Z的祖先,如果X是Y的父親而Y是Z的祖先.

        安裝有用的包

        用于啟動邏輯編程在Python中,我們需要安裝以下兩個包 :

        Kanren

        它為我們提供了一種簡化業務代碼編寫方式的方法邏輯.它讓我們用規則和事實來表達邏輯.以下命令將幫助您安裝kanren :

        pip install kanren

        SymPy

        SymPy是一個用于符號數學的Python庫.它旨在成為一個功能齊全的計算機代數系統(CAS),同時保持代碼盡可能簡單,以便易于理解和易于擴展.以下命令將幫助您安裝SymPy :

        pip install sympy

        邏輯編程的例子

        以下是一些可以通過邏輯編程和減號解決的例子;

        匹配數學表達式

        實際上,我們可以通過非常有效的方式使用邏輯編程來找到未知值.以下Python代碼將幫助您匹配數學表達式 :

        考慮首先導入以下包并減去;

        from kanren import run, var, factfrom kanren.assoccomm import eq_assoccomm as eqfrom kanren.assoccomm import commutative, associative

        我們需要定義我們將要使用的數學運算 :

        add = 'add'mul = 'mul'

        加法和乘法都是交流過程.因此,我們需要指定它,這可以按照以下順序完成;

        fact(commutative, mul)fact(commutative, add)fact(associative, mul)fact(associative, add)

        定義變量是必須的;這可以按照以下方式完成 :

        a, b = var('a'), var('b')

        我們需要將表達式與原始模式匹配.我們有以下原始模式,基本上是(5 + a)* b :

        Original_pattern = (mul, (add, 5, a), b)

        我們有以下兩個表達式與原始模式匹配 :

        exp1 = (mul, 2, (add, 3, 1))exp2 = (add,5,(mul,8,1))

        可以使用以下命令打印輸出 :

        print(run(0, (a,b), eq(original_pattern, exp1)))print(run(0, (a,b), eq(original_pattern, exp2)))

        運行此代碼后,我們將得到以下輸出 :

        ((3,2))()

        第一個輸出表示 a b 的值.第一個表達式與原始模式匹配并返回 a b 的值,但第二個表達式與原始模式不匹配,因此沒有返回任何內容.

        檢查素數

        在邏輯編程的幫助下,我們可以從數字列表中找到素數,也可以生成素數.下面給出的Python代碼將從數字列表中找到素數,并且還將生成前10個素數.

        我們首先考慮導入以下包 :

        from kanren import isvar, run, memberofrom kanren.core import success, fail, goaleval, condeseq, eq, varfrom sympy.ntheory.generate import prime, isprimeimport itertools as it

        現在,我們將定義一個名為prime_check的函數來檢查質數基于給定的數字作為數據.

        def prime_check(x):if isvar(x):   return condeseq([(eq,x,p)] for p in map(prime, it.count(1)))else:   return success if isprime(x) else fail

        現在,我們需要聲明一個將使用和減去的變量;

        x = var()print((set(run(0,x,(membero,x,(12,14,15,19,20,21,22,23,29,30,41,44,52,62,65,85)),(prime_check,x)))))print((run(10,x,prime_check(x))))

        上述代碼的輸出如下 :

        {19, 23, 29, 41}(2, 3, 5, 7, 11, 13, 17, 19, 23, 29)

        解決謎題

        邏輯編程可用于解決許多問題,如8-puzzles,Zebra puzzle,Sudoku,N-queen,這里我們舉一個Zebra拼圖變體的例子,如下&&;

        There are five houses.The English man lives in the red house.The Swede has a dog.The Dane drinks tea.The green house is immediately to the left of the white house.They drink coffee in the green house.The man who smokes Pall Mall has birds.In the yellow house they smoke Dunhill.In the middle house they drink milk.The Norwegian lives in the first house.The man who smokes Blend lives in the house next to the house with cats.In a house next to the house where they have a horse, they smoke Dunhill.The man who smokes Blue Master drinks beer.The German smokes Prince.The Norwegian lives next to the blue house.They drink water in a house next to the house where they smoke Blend.

        我們正在解決問題誰擁有斑馬在Python的幫助下.

        讓我們導入必要的包 :

        from kanren import *from kanren.core import lallimport time

        現在,我們需要定義兩個函數 :  left() next()檢查誰的房子在誰的房子旁邊或旁邊;

        def left(q, p, list):   return membero((q,p), zip(list, list[1:]))def next(q, p, list):   return conde([left(q, p, list)], [left(p, q, list)])

        現在,我們將聲明一個變量的房子如下 :

        houses = var()

        我們需要在lall包的幫助下定義規則如下.

        有5個房子:

        rules_zebraproblem = lall(   (eq, (var(), var(), var(), var(), var()), houses),   (membero,('Englishman', var(), var(), var(), 'red'), houses),   (membero,('Swede', var(), var(), 'dog', var()), houses),   (membero,('Dane', var(), 'tea', var(), var()), houses),   (left,(var(), var(), var(), var(), 'green'),   (var(), var(), var(), var(), 'white'), houses),   (membero,(var(), var(), 'coffee', var(), 'green'), houses),   (membero,(var(), 'Pall Mall', var(), 'birds', var()), houses),   (membero,(var(), 'Dunhill', var(), var(), 'yellow'), houses),   (eq,(var(), var(), (var(), var(), 'milk', var(), var()), var(), var()), houses),   (eq,(('Norwegian', var(), var(), var(), var()), var(), var(), var(), var()), houses),   (next,(var(), 'Blend', var(), var(), var()),   (var(), var(), var(), 'cats', var()), houses),   (next,(var(), 'Dunhill', var(), var(), var()),   (var(), var(), var(), 'horse', var()), houses),   (membero,(var(), 'Blue Master', 'beer', var(), var()), houses),   (membero,('German', 'Prince', var(), var(), var()), houses),   (next,('Norwegian', var(), var(), var(), var()),   (var(), var(), var(), var(), 'blue'), houses),   (next,(var(), 'Blend', var(), var(), var()),   (var(), var(), 'water', var(), var()), houses),   (membero,(var(), var(), var(), 'zebra', var()), houses))

        現在,使用前面的約束運行解算器 :

        solutions = run(0, houses, rules_zebraproblem)

        借助以下代碼,我們可以從求解器中提取輸出 :

        output_zebra = [house for house in solutions[0] if 'zebra' in house][0][0]

        以下代碼將幫助打印解決方案 :

        print ('\n'+ output_zebra + 'owns zebra.')

        上述代碼的輸出如下:

         German owns zebra.

        免責聲明:以上內容(如有圖片或視頻亦包括在內)有轉載其他網站資源,如有侵權請聯系刪除

        中文在线天堂中文

        1. <track id="5jh9g"><ruby id="5jh9g"></ruby></track>