在Prolog中使用字符串连接解决约束

时间:2015-06-15 05:50:02

标签: prolog swi-prolog

在这里,我尝试在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.

1 个答案:

答案 0 :(得分: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中的双引号现在具有不一致的含义。要获得传统行为,请使用命令行选项--traditional

调用SWI
?- 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).