2015-06-15 47 views
2

在這裏,我試圖解決Prolog中的一些簡單的字符串約束。儘管此問題似乎很直接,但謂詞仍不會打印FinalString的值,該值應爲"hello world"。 Prolog是否有可能解決包含字符串連接的約束,就像這樣?在Prolog中解決字符串連接的限制

回答

3

如果作爲初學者做實驗,最好堅持使用。以這種方式,您可以快速識別問題。既然你是最有可能使用SWI7 - 像這樣:

?- append("hello ", B, FinalString), 
    append(A, "world", FinalString), 
    append(A, B, FinalString). 
false. 

因此,如果這是假的,讓概括它,通過移除最右邊的目標:

?- append("hello ", B, FinalString), 
    append(A, "world", FinalString). 
false. 

不想...

?- append("hello ", B, FinalString). 
false. 

實際的問題是SWI中的雙引號現在具有不符合的含義。爲了讓傳統的行爲,調用SWI命令行選項--traditional和:

?- set_prolog_flag(double_quotes,chars). 
true. 

?- append("hello ", B, FS). 
FS = [h, e, l, l, o, ' '|B]. 

如需更多關於這個標誌見this answer。現在

原始查詢產生一個合理的答案:

?- append("hello ", B, FS),append(A, "world", FS),append(A, B, FS). 
B = [w, o, r, l, d], 
FS = [h, e, l, l, o, ' ', w, o, r|...], 
A = [h, e, l, l, o, ' '] ; 
**LOOPS** 

...或不是嗎?它找到了你想要的答案,但同時,在被問及是否還有其他答案時,它會循環!使用頂層外殼時可以很容易地檢測到這些問題,但仍然不會像腳本一樣檢測到腳本。這個循環是一個固有的問題。有沒有簡單的辦法,因爲只有一個解決方案的事實是造成所有三個目標在一起

如果你真的喜歡它寫成一個劇本,而是寫像這樣:

:- set_prolog_flag(double_quotes, chars). 

main :- 
    append("hello ", B, FinalString), 
    append(A, "world", FinalString), 
    append(A, B, FinalString), 
    write(FinalString), 
    nl, 
    halt. 

:- initialization(main). 
+0

可能更容易使用[約束處理規則語法]來解決這個問題(HTTP://webhotel4.ruc .dk /〜henning/chrg/CHRGusersGuide.html),其目的是解決像這樣的問題。 –