2012-05-19 180 views
2

我有很多等式,我正在嘗試使用PROLOG來解決。但是,由於它們沒有以任何有用的順序被指定 - 即在定義之前使用了一些變量(如果不是很多變量的話),所以我得到了一個小的收穫。這些都在同一個謂詞中指定。 PROLOG可以處理以隨機順序指定的謂詞嗎?PROLOG謂詞順序

+1

這可能是輕微的有用 - http://stackoverflow.com/questions/1425009/how-do-i-need-to-order-these-prolog-rules-so-我可以運行我的程序 – ravi

回答

4

絕對...妮(意大利語,是不)

也就是說,理想的Prolog需要指定什麼必須計算,不如何,寫下方程以相當一般的邏輯形式控制解決方案,即Horn clauses

但是這種理想遠不能實現,而這正是程序員扮演一個角色的地步。你應該嘗試拓撲排序公式,如果你想讓Prolog只應用算術/算法。

但是在這一點上,Prolog並沒有比任何其他過程語言更有用。從這個意義上說,公式可以是read(這個內建的Prolog解析器是完整的!),易於識別和量化的變量,轉換和評估的術語等(元語言特徵,序言)。

如果您可以使用CLP(FD),情況會發生變化。只是一個例子,一個雙向的階乘(酷,不是嗎?),從光亮的實現,爲Markus Triska SWI-Prolog的開發的文檔:

You can also use CLP(FD) constraints as a more declarative alternative for ordinary integer arithmetic with is/2, >/2 etc. For example: 

:- use_module(library(clpfd)). 

n_factorial(0, 1). 
n_factorial(N, F) :- N #> 0, N1 #= N - 1, F #= N * F1, n_factorial(N1, F1). 

This predicate can be used in all directions. For example: 

?- n_factorial(47, F). 
F = 258623241511168180642964355153611979969197632389120000000000 ; 
false. 

?- n_factorial(N, 1). 
N = 0 ; 
N = 1 ; 
false. 

?- n_factorial(N, 3). 
false. 

To make the predicate terminate if any argument is instantiated, add the (implied) constraint F #\= 0 before the recursive call. Otherwise, the query n_factorial(N, 0) is the only non-terminating case of this kind. 

因此,如果你寫在你的CLP公式(FD)你有更多的機會讓你的'方程系統'按原樣解決。 SWI-Prolog針對用於解決CLP(FD)的低級細節進行了專門的調試。

HTH

+0

該庫不包括我需要的一些運算符 - 主要是二元運算符。 – Puppy

+0

我認爲,在SWI-Prolog中,CLP(FD)庫具有大部分(如果不是全部的話)算術謂詞。但是如果你錯過了一個,那麼除了在謂詞中重新排序變量之外,我看不到任何其他方法。 – CapelliC