在这里,我尝试在Prolog中解决一些简单的字符串约束。虽然此问题似乎很简单,但main
谓词仍然不会打印FinalString
的值,该值应为"hello world"
。 Prolog是否可以解决包含字符串连接的约束,比如这个?
:- set_prolog_flag(verbose,silent).
:- prompt(_, '').
:- use_module(library(readutil)).
main :-
append("hello ", B, FinalString),
append(A, "world", FinalString),
append(A, B, FinalString),
writeln(FinalString),
true.
:-main.
答案 0 :(得分:3)
如果您作为初学者进行实验,最好坚持使用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中的双引号现在具有不一致的含义。要获得传统行为,请使用命令行选项--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**
......或者是吗?它找到了你想要的答案,但与此同时,当被问及是否有进一步的答案时,它会循环!使用顶层shell时可以很容易地检测到这些问题,但是仍然无法使用脚本检测到这些问题。这个循环是一个固有的问题。没有简单的方法,因为只有一个解决方案的事实是由所有三个目标引起的。
如果你真的想把它写成一个脚本,那就这样写::- 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).