【问题标题】:Basic number comparison in prolog?prolog中的基本数字比较?
【发布时间】:2020-01-27 22:07:29
【问题描述】:

我目前正在尝试在 prolog 中实现一种基于 Hilo 的游戏,其中基本功能基于设置一个秘密数字,并让用户/程序通过“太低”来猜测它的前进方向,或“太高”。

我的思考过程是这样的:在任何其他语言中,我都会这样想:

int secret_number = 50;
int guess = Console.ReadLine();

if(guess < secret_number) Console.WriteLine("Too low!");
else if(guess > secret_number) Console.WriteLine("Too high!");
else Console.WriteLine("You found the secret number!");

我在 Prolog 中重现此内容的尝试有所不同,但现在位于:

secret_number(85).

hilo(Guess):-
    Guess < secret_number, write("Too low!"),
    Guess > secret_number, write("Too high!"),
    write("You found the secret number!").

?-hilo(85).

但是任何熟悉 prolog 的人都会看到这可能是多么不正确。首先,我们得到一个算术错误,说 secret_number 不是一个函数。为了解决这个问题,我尝试将secret_number 作为参数发送,而不是将其用作“全局”变量(正如我所看到的那样),但这似乎没有多大帮助。除此之外,我们也得到了一个目标(指令)失败,但我想在这种情况下这是理所当然的。

我意识到这是非常基本的,但在我看来,我们都必须从某个地方开始。任何和所有的帮助/指针将不胜感激!

【问题讨论】:

    标签: prolog


    【解决方案1】:

    首先,Prolog 不做if 语句。每个谓词(您所称的函数)都会评估语句并尝试使它们为真。如果有多个可能的事实,则需要多个谓词。谓词也是自包含的。您不能期望谓词知道另一个谓词中的内容。这是您的代码的更简洁版本(我没有对其进行测试,不保证它可以正常工作)。

    secret_number(85). %initialize secrete number to 85
    
    hilo(Guess):-
        secret_number(Num), %secrete_number evaluates Guess to be 85
        Guess = Num,
        write("You found the secret number!").
    
    %if your guess is incorrect, move on to a different predicates
    hilo(Guess):-
        secret_number(Num),
        Guess < Num,
        write("Too low!").
    
    %if the previous two predicates are both false, this one will be evaluated
    hilo(Guess):-
        secret_number(Num),
        Guess > Num,
        write("Too high!").
    

    那么你需要在一个查询窗口中写一个查询:

    ?-hilo(74).
    

    【讨论】:

    • 好的,公平的。我测试了它,它似乎工作。但我想我唯一不能理解的是为什么需要secret_number(Num),?对我来说,您似乎只需要一个“变量”,将其分配给另一个,然后使用它的“副本”,如果您愿意的话?
    • 就像我之前说的,每个谓词只知道它本身是什么。如果您想要其他信息,则必须调用具有它的谓词。因此,调用secret_number(Num) 作为规则将查询secret_number 以查看使规则为真的Num 的值是什么。这是获得秘密数字值的唯一方法。 (除非你只想做Guess &lt; 85)。
    【解决方案2】:

    例如,您可以使用 ISO 谓词 compare/3 以及比较运算符只是原子的事实来缩短您的代码

    message(<, 'too low').
    message(>, 'too high').
    message(=, 'found!').
    
    hilo :-
      read(Guess),
      secret_number(Secret),
      compare(C, Guess, Secret),
      message(C, Msg),
      writeln(Msg).
    

    无论如何,ISO Prolog 中的 if/then/else 采用这种形式:

    hilo(Guess):-
        secret_number(Secret),
        (  Guess < Secret
        -> write("Too low!")
        ;  Guess > Secret
        -> write("Too high!")
        ;  write("You found the secret number!")
        ).
    

    请注意,(可能很昂贵的)secret_number/1 谓词只被调用一次...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      相关资源
      最近更新 更多