Notice: Trying to access array offset on value of type bool in /home1/freesand/public_html/wp-content/plugins/wiki-embed/WikiEmbed.php on line 112

Notice: Trying to access array offset on value of type bool in /home1/freesand/public_html/wp-content/plugins/wiki-embed/WikiEmbed.php on line 112

Notice: Trying to access array offset on value of type bool in /home1/freesand/public_html/wp-content/plugins/wiki-embed/WikiEmbed.php on line 116
FreeSandal | 輕。鬆。學。部落客 | 第 274 頁

勇闖新世界︰ 《 pyDatalog 》【專題】之約束編程‧一

雖說『直覺自明』的事物容易理解,然而有時卻會失於浮面,不能夠深入內蘊。以致於對某些典型問題不易給『嚴密』的描述,難以用『邏輯』來處理。舉例說所謂的『覆面算

覆面算是用英文字母(亦可以是方塊字或符號)來取代 0 至 9 的數字,要求玩者找回那些字母代表的數字的趣題形式。 

是一種有『約束條件』的『方程式』求解。通常這類問題一聽就懂 ,卻因有太多的變數框住,不好求解。維基百科『語詞算術』

Verbal arithmetic

Verbal arithmetic, also known as alphametics, cryptarithmetic, crypt-arithmetic, cryptarithm or word addition, is a type of mathematical game consisting of a mathematical equation among unknown numbers, whose digits are represented by letters. The goal is to identify the value of each letter. The name can be extended to puzzles that use non-alphabetic symbols instead of letters.

The equation is typically a basic operation of arithmetic, such as addition, multiplication, or division. The classic example, published in the July 1924 issue of Strand Magazine by Henry Dudeney,[1] is:

\begin{matrix}<br />      &   & \text{S} & \text{E} & \text{N} & \text{D} \\<br />    + &   & \text{M} & \text{O} & \text{R} & \text{E} \\<br />  \hline<br />    = & \text{M} & \text{O} & \text{N} & \text{E} & \text{Y} \\<br /> \end{matrix}

The solution to this puzzle is O = 0, M = 1, Y = 2, E = 5, N = 6, D = 7, R = 8, and S = 9.

Traditionally, each letter should represent a different digit, and (as in ordinary arithmetic notation) the leading digit of a multi-digit number must not be zero. A good puzzle should have a unique solution, and the letters should make up a phrase (as in the example above).

Verbal arithmetic can be useful as a motivation and source of exercises in the teaching of algebra. ……

詞條所舉的『亨利‧杜德耐』Henry Dudeney 於一九二四年,在 Strand Magazine 所發表的『SEND + MORE = MONEY』就是經典的例子。既然 pyDatalog 是一種『宣告式編程』,就讓我們開個專題研究一下如何用 pyDatalog 來寫『約束編程』

Constraint programming

In computer science, constraint programming is a programming paradigm wherein relations between variables are stated in the form of constraints. Constraints differ from the common primitives of imperative programming languages in that they do not specify a step or sequence of steps to execute, but rather the properties of a solution to be found. This makes constraint programming a form of declarative programming. The constraints used in constraint programming are of various kinds: those used in constraint satisfaction problems (e.g. “A or B is true”), those solved by the simplex algorithm (e.g. “x ≤ 5″), and others. Constraints are usually embedded within a programming language or provided via separate software libraries.

Constraint programming can be expressed in the form of constraint logic programming, which embeds constraints into a logic program. This variant of logic programming is due to Jaffar and Lassez, who extended in 1987 a specific class of constraints that were introduced in Prolog II. The first implementations of constraint logic programming were Prolog III, CLP(R), and CHIP.  ……

之程式,希望能加深讀者對 pyDatalog 語言及應用的了解。

如果考之以歷史,或許最早的『語詞算術』,可能源於中國古代的『天元術』︰

在中國數學史上最早創立天元概念的是北宋平陽蔣周所著的《益古集》,隨後有博陸李文一撰《照膽》,鹿泉石信道撰《鈐經》,平水劉汝諧撰《如積釋鎖》,處州李思聰《洞淵九容》後人才知道有天元。

李冶在東平獲得劉汝諧撰《如積釋鎖》,書中用十九個單字表示未知數的各個x^9x^-9的冪:

仙、明、霄、漢、壘、層、高、上、天、人、地、下、低、減、落、逝、泉、暗、鬼;其中立天元在上。

後來有太原彭澤彥出,反其道而行,以天元在下[2]

《益古集》,《照膽》,《鈐經》,《如積釋鎖》,《洞淵九容》等早期天元術著作今已失傳。李冶在《測圓海鏡》中使用天元在上的天元術。後來李冶又著《益古演段》,採用天元在下的次序。朱世傑四元玉鑒》和《算學啟蒙》卷下也採用天元在下的次序。

 

Wylie_on_Tian_Yuen

 

在天元術中,一次項係數旁記一「元」字(或在常數項旁記一「太」字)。

歷史上有兩種次序:
《測圓海鏡》式

「元」以上的係數表示各正次冪,「元」以下的係數表示常數項和各負次冪)。

例:李冶《測圓海鏡》第二卷第十四問方程:-x^2-680x+96000=0

Counting rod v-1.png
Counting rod h6.pngCounting rod h-8.pngCounting rod 0.png
Counting rod v9.pngCounting rod h6.pngCounting rod 0.pngCounting rod 0.pngCounting rod 0.png
《益古演段》式

「元」以下的係數表示各正次冪,「元」以上的係數表示常數和各負次冪

例一:

李冶益古演段》卷中第三十六問中的方程=3x^2+210x-20325 用天元術表示為:

 

Counting rod v2.pngCounting rod 0.pngCounting rod v-3.pngCounting rod h2.pngCounting rod v5.png

Counting rod v2.pngCounting rod h1.pngCounting rod 0.png 元(x)

Counting rod v3.pngx^2項)

 

其中「太」是常數項,算籌Counting rod v3.png 打斜線表示該項常數為負數。 「元」相當於未知數x

 

對於東方早期古典『高階方程式論』有興趣之讀者,也許可以讀讀金代數學家李冶所著『測圓海鏡』,體會一下不同的『思路』。或將可以感受『符號學』的發展對於『數理邏輯』的貢獻,了解有時理解的難易就藏在『記號法』之中,畢竟『符號』也能有『美學』的吧!!

 

 

 

 

 

 

 

 

勇闖新世界︰ 《 pyDatalog 》 導引《十》豆鵝狐人之後設篇

假使我們拿一本『英文字典』查『 logic 』是什麼?

Definition of logic in English:
noun
[mass noun]
1 Reasoning conducted or assessed according to strict principles of validity:

‘experience is a better guide to this than deductive logic’
‘the logic of the argument is faulty’

結果發現它和『 Reasoning 』有關,再查之後…

Definition of reasoning in English:
noun
[mass noun]
The action of thinking about something in a logical, sensible way:

‘he explained the reasoning behind his decision at a media conference’

又發現此與『logical』聯繫,於是人們問只靠著『英文字典』,有沒有可能『學會』英文的呢?語詞的『字典定義』總是會落入循環 疊套之中,那麼人類是如何『理解』語言的呢??如是說來笛卡兒的『第一哲學』之『懷疑一切』的精神,終究自反其身,也難逃『無窮回復』其義,講不清『認知』的『第一義』到底怎麼來的哩 !此事我們在《桶中之腦??》一文中談過︰

───

笛卡兒在『第一哲學沉思集』中說︰

若果我在『做夢』或『被騙』,那麼我的『認知』即是『不可靠』的

笛卡兒用著『懷疑一切』的精神,苦苦尋覓『確定無疑』之基石,然後講︰

我思故我在。

若是我不存在,那懷疑之思又是誰之思呢?所以說『懷疑之我』的『懷疑之思』一事是無法被懷疑的,也就只能是一個確定無疑的『事實』了。

一九八一年美國當代著名哲學家希拉蕊‧懷特哈爾‧普特南 Hilary Whitehall Putnam 《理性、真理和歷史》Reason, Truth, and History 一書提出了『桶中之腦』Brain in a vat ,一個關於知識論的思想實驗︰

280px-Braininvat

Brain_in_a_vat_(en)

這 個思想實驗的基本前提是人類所體驗到的一切最終都將在大腦中轉化為 神經信號。假使一個瘋子科學家、機器或者任何未知之意識將一個人的大腦從顱中取出,裝入一個盛有特殊營養液的桶中維持著大腦原有的生理活性。這時有一台超 級任務圖靈機通過神經末梢向大腦傳遞和原本一樣的各種神經物質的電子信號,並且對於大腦發出的各類信號給予和平常一樣的信號回饋。可以說此刻大腦正在體驗 的世界其實是電腦製造的一種『模擬現實』Simulated reality,問題是這個大腦是否能意識到自己事實上是在模擬現實之中的呢?

該書中普特南說有一種稱作『自相反駁』self-refuting 的『矛盾句』,比方講『所有的全稱命題都是假的』,因為這句話自身是『全稱』的,所以『矛盾』故為『假』。他又講『我不存在』如果是我『自己想』這句話︰『我想我不存在』也是自相反駁的。他用『螞蟻的足跡』之『物理圖像』即使描繪的再像『二戰時的英國首相邱吉爾』也不『表徵』representation 『那個存在過的人』,也可以說螞蟻根本沒有『邱吉爾』是什麼的『心理圖象』mental image。然而人類使用的『語詞』與『指涉』reference 『實際存在物』也沒有『必然關係』。他講了在一個所有方面都和我們類似的『孿生地球』上,在那裡並沒有像這裡一樣的『』,只有『黴菌』般的『植物』,偶然的一艘飛宇宙船掉下了一張『樹的畫』,即使他們也有與我們相同的心理圖象,但是那個卻不是我們所說的『樹之意象』。假使該行星的人,也說著和地球類似的語言,可是卻不知道他們的『』之分子式是『XYZ』,而那『水』字指涉著和我們一樣的河流、湖泊與大海裡的那種『液體』。當他們說︰『這桌上有一杯水』時想必不是指涉『H_2O』──  我們的水── 。所以『桶中之腦』無法『』或者是『』『我是桶中之腦』,因為『桶中之桶』之不會是『桶外之桶』之,然而在那個『模擬現實』中,就像孿生地球上的『』或是『』一樣,不可能指涉『桶外』之『』。再說在『所有可能存在』的世界中『』字到底該『詮釋』成什麼『意義』都還是不確定呢?

心靈』與『物腦』是『一元』還是『二元』的呢?或有發生之『先後』的嗎?或是『此生彼』?『彼生此』?『彼此互生』?『彼此無涉』?假使不指涉『外在世界』,『內在心、物』能有『內、外』之『神知』的嗎?假使無有,那它將如何『理解』語詞的『意義』?或能『詮釋』真實之『存在』的呢??───

那麼我們將如何『確定』用『邏輯網』來『表達』豆鵝狐人的論述 ,在 『理則』上來講是『對等的』呢!?就像有人宣稱︰這個世界上沒有『真理』。有人議論︰如果『這個世界上沒有『真理』』,那麼這個世界上沒有『真理』』這句話,就是『真理』。局中之人談著局內之事,或許認為用著『超然物外』的觀點,區分了『內』、『外』之別,設想構思了『元語言Metalanguage  如此就能夠解決這個『難題』耶?可是『意在言外』,真的可用『言』來論斷『意』的嗎?!這也就是『後設』之所以還有『後設』之故 ,『理則』依舊是陷於『無盡』的階層裡的吧!!

因此為了免於用很多『術語』與『公設』,只為了證明︰

不自相交的平面封閉曲線,將平面分割成曲線內、曲線外以及曲線三個部份。

。有關『豆鵝狐人』比擬為『邏輯網』之當或不當,我們將祇訴諸『直覺』上之『自明』而已。如是一條『邏輯線』的『狀態』路徑或講『事實』推導關係,不過只是『先行事實』、『獨立事實』── 與次序無關 ── 、和『推導事實』,基本依據『若則』關係的『某一演繹』先後次序︰

fact_1,and \ fact_2, \cdots \longrightarrow fact_i,and \cdots fact_j, \cdots \longrightarrow fact_n, \cdots

。要是一個『事實狀態』有多條『邏輯線』可以通達,也不過代表了『理則』的『或』之描述︰

fact_x \cdots \ \longrightarrow \ FACT

or

fact_y \cdots \  \longrightarrow \ FACT

如此簡單的一個『想法』罷了,至於那邏輯之『嚴密性』的考察就留與其人的了。

 

 

 

 

 

 

 

勇闖新世界︰ 《 pyDatalog 》 導引《十》豆鵝狐人之推理篇

《 網 》網的本義就是『結網捕魚』,如今我們已經討論過多種『網』,它們雖然名稱不同,許多性質卻是一樣的。為了避免有『漏網之魚』,在此特補之以

物理哲學·中中》之文摘︰

理所當然』未必一定是『理有必然』,就像說『改善交通』應該『多開條路』的吧!!德國數學家迪特里希‧布雷斯 Dietrich Braess 宣稱︰

在一個交通網上新闢一條通路,反而可能使得用路所需的時間增加了;這一條新闢的道路,非但無助於減少交通遲滯,卻很可能會降低了整個交通網的服務水準。

500px-Braess_paradox_road_example.svg
T_{SE}^{A} = \frac{A}{100} + 45
T_{SE}^{B} = 45 + \frac{B}{100}

納什均衡, T_{SE}^{A} = T_{SE}^{B}
\therefore T_{eq} = 45 + \frac{2000}{100} = 65

如果 T_{AB} \approx 0,最佳選擇
T_{best} = T_{SA} + T_{AB} + T_{BE}
= \frac{4000}{100} + 0 + \frac{4000}{100} = 80

那麼布雷斯的說法有道理嗎?假使請讀者設想從『起點』 Start 到『終點』 End ,原有『兩個選擇』,要不經由『A 點』,否則就得經過『B 地』。人們從『經驗』上『知道』走 T_{SA} 路段要花的時間依賴『車流量』,大概需要 T_{SA} = \frac{A}{100} 分鐘,如果選擇先『到 B』,一般與『車流量』無關,是『固定的』四十五分鐘,可是 T_{BE} 要花的時間也依賴於『車流量』,時間差不多與『A』相同,也是 T_{SB} = \frac{B}{100} 分鐘。因此『理性』考慮『最短時間』,將會是『比較兩者』的『時間差』作選擇的吧?最後達到了『博奕論』Game Theory 所說的『納什均衡』 Nash equilibrium ,此時無論怎麽選擇『所需總時間』是一樣的 T_{SE}^{A} = T_{SE}^{B},也就是說,如果假設一天平均有四千輛車經過『Start-End』,大概將『各取一半』,其中有兩千輛走『A 點』,另兩千輛經『B 處』的吧!『今有人』為著『改善交通』,於是乎在『A、B 兩地』間,開了一條『高速道路』 T_{AB} \approx 0 ,『以為能』縮短『所需總時間』,結果卻是吃力不討好『適得其反』,這又為什麼的呢??因為一天最多不過有四千輛車,這樣 T_{SA} = \frac{4000}{100} = 40 不是比 T_{SB} = 45 要小的嗎?由於 T_{AB} \approx 0,當然接著走 T_{AB} 的吧,到了『B 地』之後,依然還是 T_{BE} = \frac{4000}{100} = 40 能不是比 T_{AE} = 45 小的嗎?於是乎,所有『非傻鳥』者『必走T_{best} = T_{SA} + T_{AB} + T_{BE} 之『陽關道』,因此就 = \frac{4000}{100} + 0 + \frac{4000}{100} = 80 的了!!

現今這稱之為『布雷斯悖論』。那麼『一時』與『長久』,以及『部份』和『整體』 ,又該怎麽說的呢??

物理哲學·中下》的文引︰

500px-Braess_paradox_road_example.svg

經驗形成法則??

假使有人想作『傻鳥』嘗試走『過去習慣』的道路,可能是 T_{SA} + T_{AE} = 40 + 45 = 85,或許是 T_{SB} + T_{BE} = 45 + 40  = 85,結果 85 > 80,果真是『傻鳥』的耶!!

現象已然形成,現實已經造就,事理能夠不自圓其說的嗎??如此多年之後,這就變成了經驗法則,大概沒人會相信曾經有過更好的選擇的吧!!

那麼一個人要是『開通思路』,他是否『推理』會變得更慢的呢?也許『豆鵝狐人』的回答是︰人類的『思維』一般會形成『定勢』 ,因此通常只見着『陽關道』,少會過『獨木橋』,故而很難發生布雷斯的悖論,還是『思多識廣』的好吧!但是告誡勇闖新世界的人們,小心所創作的『人工智慧』機器,最好不要一不小心,它卻變成『傻鳥』的了??

這樣說來喬治‧波利亞的『怎樣解題』之法

George_Pólya_ca_1973

喬治‧波利亞
George Pólya

How to Solve It

suggests the following steps when solving a mathematical problem:

1. First, you have to understand the problem.
2. After understanding, then make a plan.
3. Carry out the plan.
4. Look back on your work. How could it be better?

If this technique fails, Pólya advises: “If you can’t solve a problem, then there is an easier problem you can solve: find it.” Or: “If you cannot solve the proposed problem, try to solve first some related problem. Could you imagine a more accessible related problem?”

喬治‧波利亞長期從事數學教學,對數學思維的一般規律有深入的研究,一生推動數學教育。一九五四年,波利亞寫了兩卷不同於一般的數學書《Induction And_Analogy In Mathematics》與《Patterns Of Plausible Inference》探討『啟發式』之『思維樣態』,這常常是一種《數學發現》之切入點,也是探尋『常識徵候』中的『合理性』根源。舉個例子來說,典型的亞里斯多德式的『三段論』 syllogisms ︰

P \Longrightarrow Q
P 真, \therefore Q 真。

如果對比著『似合理的』Plausible 『推理』︰

P \Longrightarrow Q
Q 真, P 更可能是真。

這種『推理』一般稱之為『肯定後件Q 的『邏輯誤謬』。因為在『邏輯』上,這種『形式』的推導,並不『必然的』保障『歸結』一定是『』的。然而這種『推理形式』是完全沒有『道理』的嗎?如果從『三段論』之『邏輯』上來講,要是 Q 為『』,P 也就『必然的』為『』。所以假使 P 為『』之『必要條件Q 為『』,那麼 P 不該是『更可能』是『』的嗎??

,一點不因提出時間古早,依然是管用的!若說應用之妙在於『能想人所不能想』和『能用人所不能用』,此法終究使人困惑?然而一個『困思勉行』者時有感悟,一位『真積力』者,己不能通,神自來通,又困惑之有的呢!!

 

 

 

 

 

 

 

 

勇闖新世界︰ 《 pyDatalog 》 導引《十》豆鵝狐人之思考篇

如果有人嘗試去跑這個『述詞』

可達狀態(X狀態, P經由, Y狀態) <=
可達狀態(X狀態, P經由一, Z狀態) &
狀態(Z狀態, P借著, Y狀態) &
(X狀態 != Y狀態) & (P經由 == P經由一 + [P借著])

可達狀態(X狀態, P經由, Y狀態) <=
狀態(X狀態, P借著, Y狀態) & (P經由 == [P借著])

,怕會『卡住』了吧!這是為什麼的呢?再怎麼說,『豆鵝狐人』也只有十六個『狀態』,可是那個『例子捷運網』確有二十五個『站名』,又不會『卡住』??事出總該必有因的吧!!將兩張圖對比一下︰

豆鵝胡人

台北捷運

 

乍看似乎沒有什麼不同!若是細瞧『捷運網』是用同色的『捷運線 』將『站名』貫串起來;然而『邏輯網』之農夫『相同行動』卻是『散布』在『狀態』網中。假使考察

【所有路徑述詞定義】

‧ 所有路徑(X站名, Y站名, P路徑甲) <=

所有路徑(X站名, Z站名, P路徑乙) & 【※前段】

連接(Z站名, Y站名) & 【※後段】

(X站名 != Y站名) & 【※避免迴路】

(X站名._not_in(P路徑乙)) & 【※避免迴路】

(Y站名._not_in(P路徑乙)) & 【※避免迴路】

(P路徑甲 == P路徑乙 + [Z站名]) 【※ 經過路徑累計】

 

‧ 所有路徑(X站名, Y站名, P路徑甲) <=

連接(X站名, Y站名) & 【※基本連接事實】

(P路徑甲 == []) 【※基本直通,無經由路徑。】

,那個『可達狀態』的述詞將要如何避開『迴路』的呢?『迴路』造成了『無窮循環』,由於『相同行動』可以出現在『循環路徑』上,要怎樣加上

(X站名._not_in(P路徑乙)) & 【※避免迴路】

(Y站名._not_in(P路徑乙)) & 【※避免迴路】

條件的呢?難道就是 pyDatalog 的『推理引擎』足以避開『捷運網 』之『迴路』情況!卻不能夠免於『邏輯網』的『循環』原因嗎?事實上此事在『HASHTAG』《八下》文本中已經觸及,在此就稍為詳細探討一下,深入了解那兩張網因著『表達』方式引發的差異性 。首先捷運網『連接(□站, ○站) 』述詞並不管是哪一條『捷運線』接連了 □站與 ○站,其實那條『捷運線』已經『隱含』在『站名』之中了。所以知道了經由『□‧○』站,也就知道搭上了哪條線。這件事在『邏輯網』也是一樣的,從『☆ 狀態』到『△ 狀態』就已確定了農夫之『◎◎行動』。其次,當相同『站名』出現在『捷運路徑』上,我們知道發生了『迴路』,應當『給予條件』避開循環 ,就是《圖的範例graph.py 所談之『安全』的實意。如是我們可依『捷運網』之『描述法』,將『邏輯網』改寫重述如下︰

 

pi@raspberrypi ~ $ python3
Python 3.2.3 (default, Mar  1 2013, 11:53:50) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pyDatalog import pyDatalog
>>> pyDatalog.create_terms('X狀態, Y狀態, Z狀態, P經由, P經由一, P借著')
>>> pyDatalog.create_terms('行動, 改變')

>>> +改變('豆鵝狐人', '豆‧狐‧')
>>> +改變('豆‧狐‧', '豆鵝狐人')
>>> +改變('豆‧狐‧', '豆‧狐人')
>>> +改變('豆‧狐人', '豆‧狐‧')
>>> +改變('豆‧狐人', '‧‧狐‧')
>>> +改變('‧‧狐‧', '豆‧狐人')
>>> +改變('‧‧狐‧', '渡河失敗')
>>> +改變('‧‧狐‧', '‧鵝狐人')
>>> +改變('‧鵝狐人', '‧‧狐‧')
>>> +改變('‧鵝狐人', '‧鵝‧‧')
>>> +改變('‧鵝狐人', '渡河失敗')
>>> +改變('‧鵝‧‧', '‧鵝狐人')
>>> +改變('‧鵝‧‧', '豆鵝‧人')
>>> +改變('豆鵝‧人', '‧鵝‧‧')
>>> +改變('‧鵝‧‧', '‧鵝‧人')
>>> +改變('‧鵝‧人', '‧鵝‧‧')
>>> +改變('‧鵝‧人', '到達彼岸')
>>> +改變('豆‧狐人', '豆‧‧‧')
>>> +改變('豆‧‧‧', '豆‧狐人')
>>> +改變('豆‧‧‧', '豆鵝‧人')
>>> +改變('豆鵝‧人', '豆‧‧‧')
>>> +改變('豆‧‧‧', '渡河失敗')
>>> +改變('豆鵝狐人', '渡河失敗')
>>> 
>>> pyDatalog.create_terms('問道')
>>> 問道(X狀態, Y狀態, P經由) <= 改變(X狀態, Z狀態) & 問道(Z狀態, Y狀態, P經由一) & (X狀態 != Y狀態) & (X狀態._not_in(P經由一 )) &  (Y狀態._not_in(P經由一)) & (P經由 == [Z狀態] + P經由一)
問道(X狀態,Y狀態,P經由) <= 改變(X狀態,Z狀態)&問道(Z狀態,Y狀態,P經由一)&!=
>>> 問道(X狀態, Y狀態, P經由) <= 改變(X狀態, Y狀態) & (P經由 == [])
問道(X狀態,Y狀態,P經由) <= 改變(X狀態,Y狀態)&==(P經由,'[]')
>>> print(問道('豆鵝狐人', '到達彼岸', P經由))
P經由                                             
------------------------------------------------
('豆‧狐‧', '豆‧狐人', '‧‧狐‧', '‧鵝狐人', '‧鵝‧‧', '‧鵝‧人')
('豆‧狐‧', '豆‧狐人', '豆‧‧‧', '豆鵝‧人', '‧鵝‧‧', '‧鵝‧人')
>>> 
>>> pyDatalog.create_terms('取道')
>>> 取道(X狀態, Y狀態, P經由) <= 取道(X狀態, Z狀態, P經由一) & 改變(Z狀態, Y狀態) & (X狀態 != Y狀態) & (X狀態._not_in(P經由一 )) &  (Y狀態._not_in(P經由一)) & (P經由 == P經由一 + [Z狀態])
取道(X狀態,Y狀態,P經由) <= 取道(X狀態,Z狀態,P經由一)&改變(Z狀態,Y狀態)&!=
>>> 取道(X狀態, Y狀態, P經由) <= 改變(X狀態, Y狀態) & (P經由 == [])
取道(X狀態,Y狀態,P經由) <= 改變(X狀態,Y狀態)&==(P經由,'[]')
>>> print(取道('豆鵝狐人', '到達彼岸', P經由))
P經由                                             
------------------------------------------------
('豆‧狐‧', '豆‧狐人', '‧‧狐‧', '‧鵝狐人', '‧鵝‧‧', '‧鵝‧人')
('豆‧狐‧', '豆‧狐人', '豆‧‧‧', '豆鵝‧人', '‧鵝‧‧', '‧鵝‧人')
>>> 

 

果然得到了『預期結果』!這難道應該意外的嘛!!不過這裡用的『問道』和『取道』兩個述詞,卻有『右項』與『左項』推導之『差別』,我們可以『歸結』說,它們的『結果』總是『相同』的嗎??

 

 

 

 

 

 

 

勇闖新世界︰ 《 pyDatalog 》 導引《十》豆鵝狐人之表達篇

從『了解』

問題
有一個農民到集市買了一隻狐狸、一隻鵝和一袋豆子,回家時要渡過一條河。河中有一條船,但是只能裝一樣東西。而且,如果沒有人看管,狐狸會吃掉鵝,而鵝又很喜歡吃豆子。問:怎樣才能讓這些東西都安全過河?

到用別的語言作『改寫重述』,意味著『概念』體系對應『轉譯』 。就『邏輯問題』來講︰『事實』的『轉譯』 後依然是『事實』;由『事實』可推導的『結論』,『轉譯』 後依然是『結論』。這個『邏輯網』

豆鵝胡人

的『轉譯』就是用『狀態』表達『事實』,以『狀態變遷』 State_i  \ \frac{action} {\longrightarrow}}  \ State_j 詮釋『人的行動推理』。由於熟悉的河多半是東西向,我們就說那農夫將由『南岸』到達『北岸』的吧!如此一個有四個物象的系統,最多能有 2^4 = 16 個狀態。【※注意,以南為觀點,『‧』表達在北。

可能狀態

ˇ豆鵝狐人
╳豆鵝狐‧
ˇ豆鵝‧人
╳豆鵝‧‧
ˇ‧鵝狐人
╳‧鵝狐‧
ˇ‧鵝‧人
ˇ‧鵝‧‧
ˇ豆‧狐人
ˇ豆‧狐‧
╳豆‧‧人
ˇ豆‧‧‧
╳‧‧狐人
ˇ‧‧狐‧
╳‧‧‧人
ˇ‧‧‧‧

在此打『ˇ』的狀態代表『安全』,不會發生

狐狸吃掉鵝,或鵝吃豆子。

的事情。打『╳』的狀態說明『不安全』,終究歸於『渡河失敗』這一事態。為了彰顯『題意』,特將『‧‧‧‧』目標態命名為『到達彼岸』。再將農夫的『行動』與『狀態變遷』連繫起來︰

狀態變遷】※狀態(始態, 行動, 終態)

狀態(‘豆鵝狐人’,‘鵝人去北’,‘豆‧狐‧’)
狀態(‘豆‧狐‧’,‘鵝人回南’,‘豆鵝狐人’)
狀態(‘豆‧狐‧’,‘獨人回南’,‘豆‧狐人’)
狀態(‘豆‧狐人’,‘獨人去北’,‘豆‧狐‧’)
狀態(‘豆‧狐人’,‘豆人去北’,‘‧‧狐‧’)
狀態(‘‧‧狐‧’,‘豆人回南’,‘豆‧狐人’)
狀態(‘‧‧狐‧’,‘獨人回南’,‘渡河失敗’)
狀態(‘‧‧狐‧’,‘鵝人回南’,‘‧鵝狐人’)
狀態(‘‧鵝狐人’,‘鵝人去北’,‘‧‧狐‧’)
狀態(‘‧鵝狐人’,‘狐人去北’,‘‧鵝‧‧’)
狀態(‘‧鵝狐人’,‘獨人去北’,‘渡河失敗’)
狀態(‘‧鵝‧‧’,‘狐人回南’,‘‧鵝狐人’)
狀態(‘‧鵝‧‧’,‘豆人回南’,‘豆鵝‧人’)
狀態(‘豆鵝‧人’,‘豆人去北’,‘‧鵝‧‧’)
狀態(‘‧鵝‧‧’,‘獨人回南’,‘‧鵝‧人’)
狀態(‘‧鵝‧人’,‘獨人去北’,‘‧鵝‧‧’)
狀態(‘‧鵝‧人’,‘鵝人去北’,‘到達彼岸’)
狀態(‘豆‧狐人’,‘狐人去北’,‘豆‧‧‧’)
狀態(‘豆‧‧‧’,‘狐人回南’,‘豆‧狐人’)
狀態(‘豆‧‧‧’,‘鵝人回南’,‘豆鵝‧人’)
狀態(‘豆鵝‧人’,‘鵝人去北’,‘豆‧‧‧’)
狀態(‘豆‧‧‧’,‘獨人回南’,‘渡河失敗’)
狀態(‘豆鵝狐人’,‘獨人去北’,‘渡河失敗’)
狀態(‘豆鵝狐人’,‘狐人去北’,‘渡河失敗’)
狀態(‘豆鵝狐人’,‘豆人去北’,‘渡河失敗’)

 

這就構成了該『邏輯網』的圖說。所謂的『答案』求解推理,也就『轉譯』為『尋找』從『豆鵝狐人』狀態通往『到達彼岸』狀態之『路徑』的哩!或許此時突然開朗,果真『網網相通』井井往來的呦!!那個 pyDatalog 的程式立馬寫成︰

 

pi@raspberrypi ~ $ python3
Python 3.2.3 (default, Mar  1 2013, 11:53:50) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pyDatalog import pyDatalog
>>> pyDatalog.create_terms('狀態, 可達狀態')
>>> pyDatalog.create_terms('X狀態, Y狀態, Z狀態, P經由, P經由一, P借著')
>>> +狀態('豆鵝狐人', '鵝人去北', '豆‧狐‧')
>>> +狀態('豆‧狐‧', '鵝人回南', '豆鵝狐人')
>>> +狀態('豆‧狐‧', '獨人回南', '豆‧狐人')
>>> +狀態('豆‧狐人', '獨人去北', '豆‧狐‧')
>>> +狀態('豆‧狐人', '豆人去北', '‧‧狐‧')
>>> +狀態('‧‧狐‧', '豆人回南', '豆‧狐人')
>>> +狀態('‧‧狐‧', '獨人回南', '渡河失敗')
>>> +狀態('‧‧狐‧', '鵝人回南', '‧鵝狐人')
>>> +狀態('‧鵝狐人', '鵝人去北', '‧‧狐‧')
>>> +狀態('‧鵝狐人', '狐人去北', '‧鵝‧‧')
>>> +狀態('‧鵝狐人', '獨人去北', '渡河失敗')
>>> +狀態('‧鵝‧‧', '狐人回南', '‧鵝狐人')
>>> +狀態('‧鵝‧‧', '豆人回南', '豆鵝‧人')
>>> +狀態('豆鵝‧人', '豆人去北', '‧鵝‧‧')
>>> +狀態('‧鵝‧‧', '獨人回南', '‧鵝‧人')
>>> +狀態('‧鵝‧人', '獨人去北', '‧鵝‧‧')
>>> +狀態('‧鵝‧人', '鵝人去北', '到達彼岸')
>>> +狀態('豆‧狐人', '狐人去北', '豆‧‧‧')
>>> +狀態('豆‧‧‧', '狐人回南', '豆‧狐人')
>>> +狀態('豆‧‧‧', '鵝人回南', '豆鵝‧人')
>>> +狀態('豆鵝‧人', '鵝人去北', '豆‧‧‧')
>>> +狀態('豆‧‧‧', '獨人回南', '渡河失敗')
>>> +狀態('豆鵝狐人', '獨人去北', '渡河失敗')
>>> +狀態('豆鵝狐人', '狐人去北', '渡河失敗')
>>> +狀態('豆鵝狐人', '豆人去北', '渡河失敗')
>>> 
>>> (可達狀態[X狀態, Y狀態] == P經由) <= ((可達狀態[X狀態, Z狀態] == P經由一)) & 狀態(Z狀態, P借著, Y狀態) & (X狀態 != Y狀態) & (P經由 == P經由一 + [P借著])
可達狀態[2]==(*,X狀態,Y狀態,P經由) <= 可達狀態[2]==(*,X狀態,Z狀態,P經
>>> (可達狀態[X狀態,Y狀態] == P經由) <= 狀態(X狀態, P借著, Y狀態) & (P經由 == [P借著])
可達狀態[2]==(*,X狀態,Y狀態,P經由) <= 狀態(X狀態,P借著,Y狀態)&==(P經由
>>> print((可達狀態['豆鵝狐人', '到達彼岸'] == P經由) >= P經由)
('鵝人去北', '獨人回南', '狐人去北', '鵝人回南', '豆人去北', '獨人回南', '鵝人去北')
>>> 

現在『問題』來了,我們能用

《勇闖新世界︰ 《 pyDatalog 》 導引《七》

系列文章所探討『台北捷運網』之『所有路徑』辦法︰

可達狀態(X狀態, P經由, Y狀態) <=
狀態(X狀態, P借著, Y狀態) & (P經由 == [P借著])

可達狀態(X狀態, P經由, Y狀態) <=
可達狀態(X狀態, P經由一, Z狀態) &
狀態(Z狀態, P借著, Y狀態) &
(X狀態 != Y狀態) & (P經由 == P經由一 + [P借著])

得到所有『可能路徑』的嗎??

 

 

 

 

 

 

 

輕。鬆。學。部落客