Prolog可执行文件在代码中写入字符串

Prolog可执行文件在代码中写入字符串,prolog,native,Prolog,Native,我正在尝试创建以下Prolog代码的可执行文件: item(one, 50, 40). item(two, 80, 70). item(three, 100, 55). item(four, 50, 45). maxMeanStudy:- findall(M,item(_,M,_),L), max_member(Max,L), write("Maximum mean value:"), % this line is not printed properly.

我正在尝试创建以下Prolog代码的可执行文件:

item(one, 50, 40).
item(two, 80, 70).
item(three, 100, 55).
item(four, 50, 45).

maxMeanStudy:-  
    findall(M,item(_,M,_),L),
    max_member(Max,L),
    write("Maximum mean value:"),   % this line is not printed properly.
    writeln(Max),!.

main:-
    maxMeanStudy.
我正在使用以下命令创建本页所述的可执行文件:

创建的可执行文件不以字母形式写入字符串“最大平均值”,而是以代码形式写入:

$ ./myprog
[77,97,120,105,109,117,109,32,109,101,97,110,32,118,97,108,117,101,58]100

我在Linux(32位)上工作。我怎样才能解决这个问题。感谢您的帮助。

在几乎所有此类情况下,结果是:

  • 首先不应使用副作用。相反,定义你可以实际推理的关系。在您的例子中,您描述的是平均值与其最大值之间的关系。因此,名称
    最大平均值(Ms,M)
    表明它自己。而
    是不是比
    混合小写字母和大写字母
    更具可读性

  • 让顶级人员通过以下纯查询为您打印

    ?- maximum_mean_value(Ms, M).
    M = ... . % result is automatically shown by the toplevel!
    
  • 如果您真的需要在终端上写一些东西,请使用单独的谓词。 避免混合纯代码和不纯代码。

  • 使用
    格式/2
    格式化输出。例如:

    maximum_mean_value(Ms, M),
    format("Maximum mean value: ~d\n", [M]) 
    
    注意
    format/2
    如何使包含其他术语的文本输出变得容易


  • 看起来
    双引号
    标志已恢复为
    代码
    。因此,您的快速解决方案可能是(a)在文件开头包含指令,
    :-set_prolog_标志(双引号,字符串)。
    ,或者(b)对字符串使用单引号,使其仅为原子(这样您就不必担心双引号的解释)。当然,最好的方法是(c)注意@mat给你的答案。它起作用了。在我的代码中,哪些是“纯”和“不纯”代码?你能详细说明一下吗?更多信息请参见。如果谓词在终端上产生输出,那么它是不纯的(您不能在程序中对终端输出进行推理)。如果您的谓词只对几种可能性的特定解作出承诺,那么它是不纯净的(其他逻辑解是不纯净的)。如果您的谓词应用了诸如
    var/1
    之类的元逻辑测试,那么它是不纯的。为了从逻辑编程中真正受益,请停留在纯子集中:它使您的程序非常通用。您可以在各个方向使用这样的谓词,例如:
    ?-maximum\u mean\u value(Ms,M)。
    。那么
    字符呢?
    
    maximum_mean_value(Ms, M),
    format("Maximum mean value: ~d\n", [M])