如何使用JPL获得Prolog跟踪结果?

时间:2019-06-08 04:00:29

标签: prolog jpl

我想使用JPL来获取查询trace/0的结果。

我尝试通过控制台中的swi-prolog执行以下步骤,并且可以正常工作。

set_prolog_flag(color_term, true).
working_directory(_,"MY_PROJECT_PATH").
leash(+all).
visible(-all).
protocol("./trace_out_put.txt").
trace.
safe_to_stack(obj1, obj2)%这是要跟踪的查询
nodebug.
noprotocol.

这些步骤之后,将跟踪结果放入我的项目路径下的文件“ trace_out_put.txt”中。

使用JPL7,我在上面的这些查询中尝试了以下代码。

    String[] queries = {
                    "set_prolog_flag",
                    "working_directory",
                    "leash",
                    "visible",
                    "protocol",
                    "trace",
                    "safe_to_stack(obj1,obj2).",
                    "nodebug",
                    "noprotocol"
            };
            Term[][] param = {
                    new Term[]{new Atom("color_term"),new Atom("false")},
                    new Term[]{new Variable("_"), new Atom( "/Users/bobhu/project/prologebg","text")},
                    new Term[]{new Atom("+all")},
                    new Term[]{new Atom("-all")},
                    new Term[]{new Atom("./trace_output.txt","text")},
                    new Term[]{},
                    new Term[]{},
                    new Term[]{},
                    new Term[]{}
            };
            Query[] allQuery = new Query[queries.length];
            for (int i = 0; i < queries.length; i++) {
                allQuery[i] = new Query(queries[i], param[i]);
                System.out.println(allQuery[i]);
                try {
                    System.out.println(allQuery[i].hasSolution());
                }catch(Exception e) {
                    System.out.println("wrong at "+ i);
                }
            }

基本上,它一个接一个地执行查询。

输出显示leashvisible,但有例外,与控制台输出不同:

    set_prolog_flag( color_term, false )
    true
    working_directory( _, '/Users/bobhu/project/prologebg' )
    true
    leash( '+all' )
    wrong at leash( '+all' )
    visible( '-all' )
    wrong at visible( '-all' )
    protocol( './trace_output.txt' )
    true
    trace(  )
    true
       Call: (1) atom_to_term('safe_to_stack(obj1,obj2).', _82, _84) ? 

此外,对trace的执行也没有达到预期的效果,并且执行一直停留在这里,等待我对ENTER的键盘响应继续。

我已经检查过swi-prolog中的leash/1应该是leash(?Ports)的形式,因此将Atom而不是Port传递给leash是不正确,但是,我找不到另一种方法。

如何通过JPL自动完成所有这些操作?还是有其他方法可以获取trace的控制台输出?

1 个答案:

答案 0 :(得分:0)

这是在答案空间中张贴的评论,因为所需的格式在评论中不起作用。不要投票。

在代码运行中,您有

1. "set_prolog_flag",
2. "working_directory",
3. "leash",
4. "visible",
5. "protocol",
6. "trace",
7. "safe_to_stack(obj1,obj2).",
8. "nodebug",
9. "noprotocol"

带有参数

1. new Term[]{new Atom("color_term"),new Atom("false")},
2. new Term[]{new Variable("_"), new Atom( "/Users/bobhu/project/prologebg","text")},
3. new Term[]{new Atom("+all")},
4. new Term[]{new Atom("-all")},
5. new Term[]{new Atom("./trace_output.txt","text")},
6. new Term[]{},
7. new Term[]{},
8. new Term[]{},
9. new Term[]{}

请注意,使用Java代码是

3. "leash",
3. new Term[]{new Atom("+all")},

4. "visible",
4. new Term[]{new Atom("-all")},

尝试反转+all-all

请参阅:Wiki: How to - protocol/1