【问题标题】:How can I print unification results when using prolog script?使用 prolog 脚本时如何打印统一结果?
【发布时间】:2013-01-19 16:01:15
【问题描述】:

我正在使用 prolog 脚本进行所有查询,代码如下:

:- initialization(run).

writeln(T) :- write(T), nl.

queryAll :-
    forall(query(Q), (Q ->
        writeln('yes':Q) ;
        writeln('no ':Q))).

run :-
    queryAll,
    halt.

query( (1,2,3) = (X,Y,Z) ).

问题是queryAll 只会打印“是”或“否”,而我想看到统一结果,例如:

X = 1
Y = 2
Z = 3

如何在序言中做到这一点? 提前致谢。

【问题讨论】:

  • 如果我在 gprolog 中运行,添加 forall/2 后,我会看到 yes:((1,2,3)=(1,2,3))。您可以尝试format('yes:~w~n', [Q]) 而不是 writeln(yes:Q),但似乎您还有其他问题。您需要查看变量名称吗?
  • 请注意,您可以使用选项variable_names/1 在GNU-Prolog(最新版本)中方便地读取写出变量名。

标签: prolog gnu-prolog unification


【解决方案1】:

在 GNU Prolog 中,您可以在将 end_of_term(eof) 选项传递给 read_term_from_atom 时避免最后一个点。例如:

| ?- read_term_from_atom('X+Y = 1+2', T, [variable_names(L),end_of_term(eof)]).

L = ['X'=A,'Y'=B]
T = (A+B=1+2)``

这意味着当遇到 EOF(文件结尾)时,它被视为正在读取的术语的结尾。从原子读取时,EOF 对应于原子的字符串表示的 then。

这在某些情况下可以简化事情。

【讨论】:

    【解决方案2】:

    这里有一个 gprolog 内置示例,它们可能有助于为您的客户打造更好的体验:

    | ?- read_term_from_atom('X+Y = 1+2.', T, [variable_names(L)]).
    
    L = ['X'=A,'Y'=B]
    T = A+B=1+2
    
    yes
    | ?- read_term_from_atom('X+Y = 1+2.', T, [variable_names(L)]),call(T).
    
    L = ['X'=1,'Y'=2]
    T = 1+2=1+2
    

    请注意,您应该更改 query/1 内容:而不是

    query( (1,2,3) = (X,Y,Z) ).
    

    应该是

    query( '(1,2,3) = (X,Y,Z).' ). % note the dot terminated atom
    

    然后循环可能是,例如

    queryAll :-
        forall(query(Q), 
            ( read_term_from_atom(Q, T, [variable_names(L)]),
              ( T -> writeln('yes':L) ; writeln('no ':Q) )
            )).
    

    我从this 答案中得到提示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 2013-09-13
      • 2013-02-13
      • 2021-09-30
      • 2016-09-19
      相关资源
      最近更新 更多