【问题标题】:Prolog returns a list instead of several possible stringsProlog 返回一个列表而不是几个可能的字符串
【发布时间】:2011-09-19 01:12:19
【问题描述】:
answer("Yes").
answer("No").
answer("Variable = value").
receive(A) :- answer(A).


2 ?- answer(A).

A = [89, 101, 115]

Yes

我想要A = "Yes" 等。我做错了什么?

【问题讨论】:

    标签: string list prolog logic


    【解决方案1】:

    您将获得字符串 Yes、No 和 Variable = value 的列表表示形式。

    如果您想使用术语 Yes、No 和 Variable = value 来实例化 A,您应该将它们括在单引号而不是双引号之间:

    answer('Yes').
    answer('No').
    answer('Variable = value').
    

    如果你想返回包含双引号的术语,你应该包括它们但也用单引号括起来每个术语:

    answer('"Yes"').
    answer('"No"').
    answer('"Variable = value"').
    

    【讨论】:

      【解决方案2】:

      你没有做错任何事。 [89, 101, 115]"Yes" 相同:

      2 ?- [89, 101, 115] = "Yes".
      true.
      

      编辑:您可以使用this module 做您想做的事。

      【讨论】:

      • 我想你误会了我。我希望 Prolog 列出我给谓词的所有值,因为它们被写成字符串......也就是说,A = "YesA = "No"A="Variable = value"
      • 如果您希望将字符代码列表打印为字符串,请参阅特定 Prolog 系统的 set_prolog_flag/2 文档。
      【解决方案3】:

      这里没有错,你只是看到了字符串的内部表示。 如果您想要更易读的输出,请尝试以下方法之一:

      (其中一些可能只在 SWI-Prolog 中工作,但您已将其标记为 SWI,所以我认为这没问题)

      使用name/2 将数字列表转换为原子:

      ?- name(X, "hallo").
      X=hallo
      
      ?- answer(X), name(Y, X).
      X = [89, 101, 115],
      Y = 'Yes' ;
      

      使用format/2 输出。

      format('~s',["hallo"]).
      hallo
      true.
      
      ?- answer(X), format('answer is "~s"',[X]).
      answer is "Yes"
      X = [89, 101, 115] ;
      answer is "No"
      X = [78, 111].
      

      或者,如果您不想使用真正的字符串(代码点列表),请使用单引号:

      answer('yes').
      answer('no').
      answer('Variable = value').
      
      ?-answer(X).
      yes;
      …
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        • 2017-10-06
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        • 2013-07-22
        相关资源
        最近更新 更多