2011-04-06 98 views
1

這個問題聽起來很奇怪,我實際上已經得到了一系列的可變因素和一些產生有效狀態的條件。當然,我會根據自己的理解寫出測試它們的代碼,但是有沒有一個系統/代碼生成器,生成了有效代碼,並進行了所有適當的優化?從真值表生成代碼!

$a $b Output 
--------------- 
    0  0 1 
    0  1 0 
    1  0 1 
    1  1 0 

所以本系統shoudl生成PHP代碼:

if($b==0) {} 

對於此:

$a $b Output 
--------------- 
    0  0 0 
    0  1 1 
    1  0 1 
    1  1 0 

它應該輸出:

if(($a!=1 && $b!=1) && ($a!=0 && $b!=0)) {} 
// any better way? 

當然,0和1這裏只是爲了說明 - 有實際的條款gs /值,我需要比較,所以聰明的乘法技術將無法正常工作。

+0

使用true/false開關甚至elseif的錯誤 – 2011-04-06 12:57:31

+0

Btw第二個例子的輸出應該是'if($ a == 1^$ b == 1)'(提供^是XOR運算符你的語言) – 2011-04-07 16:11:13

回答

1

您應該能夠通過分析真值表K-map然後編寫表達式來生成優化解決方案。

+0

任何方式,這可以自動完成?? – siliconpi 2011-04-07 13:26:09

2

您的系統是布爾邏輯的擴展(除了在值和!之間圍繞某些值,您還使用僅基於一個真值的結果,雖然有多個真值) 。所以普通的方法是行不通的,我看過K-Map,我認爲它不會在這裏工作。可以爲所有可能的子集合引入新的值(處理(A || B)& & C),然後嘗試使用所有可能的組合在所有這些子集上運算符的所有可能組合,以查看運算符組合之一是否適用於所有組合,然後通過動態編程最終推導出一條規則,您可以加快這一點,但對任何事情來說都會很慢不止兩個價值觀,編程會很麻煩。 (它將遠遠超過O(n^3)來找到這些規則)

更快/更容易/更快但更多的內存成本計算解決方案只是將所有可能的組合都存儲爲真(或全部爲假,取決於哪個列表更短)在散列表/字典/數組中。

+0

我認爲k-map會工作,但我需要它來處理字符串不是零和 – siliconpi 2011-04-07 13:26:36

0

有很多關於手工操作的文獻;看卡諾圖的地圖。 您可以自動執行其中一種技術。

但是實際上你想要做的是構造一個樸素的布爾方程來表示你的真值表,然後在這個方程中應用一個符號布爾簡化器(或者最小化器)(硬件語言合成器做它的代碼生成的一部分處理)。

構造樸素方程很簡單:爲每個行生成一個連詞 生成真值的真值表,並取所有連詞的分解。如果您應用布爾簡化這個

(~a & ~b) | (a & ~b) 

::你的第一個表中會產生幼稚方程

((~a | a) & ~b) // combine terms 
    (TRUE & ~b) // consequence of ~a | a 
    ~b // the answer 

你的第二個表會產生幼稚公式:

(~a & b) | (a & ~b) 

哪個沒有按」進一步簡化。

您可以使用program transformation system來完成此操作。這樣的系統通常允許您爲輸入語言(在本例中爲真值表)定義解析器,並定義從輸入語言到輸出語言的轉換,以及輸出語言的更多轉換。您的輸入到輸出轉換會將真值表符號映射到布爾方程符號。然後布爾方程上的變換將執行簡化。

一旦你有了一個簡化的公式,那麼你想要應用另一組轉換來從純布爾代數映射到你的最終計算機語言,在你的情況下,PHP。

我們經常用我們的DMS Software Reengineering Toolkit完成這種事情。 DMS爲問題提供了一些很好的幫助:它理解關聯和交換代數重寫,這使得面向複雜公式時簡化方程更簡單,更穩健。

在許多情況下,我們已經將DMS應用於代數布爾公式,其中包含幾十萬個文字(形式爲A或〜A的形式)。一個例子是一個代碼生成器,它接受關於如何在傳感器(讀取工廠狀態)和執行器(改變工廠狀態的東西)方面控制工廠(字面意義)的描述,對方程進行genrrated,簡化它們,然後轉換它們被稱爲PLC的工業控制器的多種不同的目標計算機語言。

您可以看到一個示例,不是布爾化簡化,而是使用DMS的real algebraic simplification。布爾簡化更容易編寫: - }

0

我認爲CKen(http://cken.sourceforge.net/)(對你有好處)。我們支持''大寫''和''小寫'',所以它支持58(= 2×29)個單變量!

而且最重要的是,多表現在它可以使用(由分隔符):

例子:a,b,c,d,e;(a+b)*c;d*e#a;

在另一方面,它是非常快的!


您必須在表達式中使用它(變量)之前定義的變量。

+0

這會生成真值表並計算值。它不會生成OP要求的代碼。 – parakmiakos 2015-04-06 10:18:36