2
在這裏,我試圖解決Prolog中的一些簡單的字符串約束。儘管此問題似乎很直接,但謂詞仍不會打印FinalString
的值,該值應爲"hello world"
。 Prolog是否有可能解決包含字符串連接的約束,就像這樣?在Prolog中解決字符串連接的限制
在這裏,我試圖解決Prolog中的一些簡單的字符串約束。儘管此問題似乎很直接,但謂詞仍不會打印FinalString
的值,該值應爲"hello world"
。 Prolog是否有可能解決包含字符串連接的約束,就像這樣?在Prolog中解決字符串連接的限制
如果作爲初學者做實驗,最好堅持使用prolog-toplevel。以這種方式,您可以快速識別問題。既然你是最有可能使用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).
可能更容易使用[約束處理規則語法]來解決這個問題(HTTP://webhotel4.ruc .dk /〜henning/chrg/CHRGusersGuide.html),其目的是解決像這樣的問題。 –