2

在终端中键入“prolog”会得到:

GNU Prolog 1.3.0

By Daniel Diaz

Copyright (C) 1999-2007 Daniel Diaz

| ?- 

打字:

| ?- member(2, [1,2,3]).

获取:

true ? 

然后按回车得到:

yes

打字:

| ?- member(4, [1,2,3]).

得到:

no

当我写一个文件时;test.pl 由以下内容组成:

:- member(4, [1,2,3]), nl, halt.

然后在终端中写入:

| ?- [test2].

我得到:

compiling /path/test.pl for byte code...
/path/test.pl:1: warning: unknown directive (',')/2 - maybe use initialization/1 - directive ignored
/path/test.pl compiled, 1 lines read - 139 bytes written, 11 ms

yes

这里的答案应该是否定的?我究竟做错了什么。另外,您将如何在 prolog 中执行此操作:

if (testInPrologTerminal(member(4, [1,2,3])) { do this; } 

即,我想向 prolog 顶层发送查询,并得到答案

4

1 回答 1

3

当您键入 querymember(2, [1,2,3])时,GNU Prolog 会提示您提供可能的附加解决方案(因此true ?提示),因为只有通过回溯(并查看列表中的最后一个元素,3)它才能检查它。当您按下回车键时,您是在告诉顶级解释器您对当前解决方案(列表第二位置中的元素 2)感到满意。第二个查询,member(4, [1,2,3]),没有解决方案,所以你得到一个no

要在加载文件时执行查询,标准且可移植的方式是使用标准initialization/1指令。在这种情况下,你会写:

:- initialization((member(4, [1,2,3]), nl, halt)).

请注意查询周围的 (),否则您可能会收到有关未知initialization/3标准、内置控件构造的警告。如果在加载文件时要执行更复杂的查询,则定义一个谓词,使查询从initialization/1指令中调用此谓词。例如:

main :-
    (   member(4, [1,2,3]) ->
        write('Query succeeded!'), nl
    ;   write('Query failed!'), nl
    ).

:- initialization(main).

在源文件中编写任意查询作为指令是传统做法,因此被多个 Prolog 实现所接受,但使用initialization/1指令是更干净、标准和可移植的替代方案。

于 2014-09-11T10:10:44.530 回答