prolog中的基本数比较?

prolog中的基本数比较?,prolog,Prolog,我目前正试图在prolog中实现一种基于Hilo的游戏,其中的基本功能是设置一个秘密号码,让用户/程序通过“过低”或“过高”来猜测未来的发展方向 我的思维过程是这样的:在任何其他语言中,我都会这样想: int secret_number = 50; int guess = Console.ReadLine(); if(guess < secret_number) Console.WriteLine("Too low!"); else if(guess > secret_number

我目前正试图在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!");
int secret\u number=50;
int guess=Console.ReadLine();
if(猜秘密号码)控制台。WriteLine(“太高了!”);
else Console.WriteLine(“你找到了密码!”);
我尝试在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).
密码(85)。
希洛(猜测):-
猜猜秘密号码,写(“太高了!”),
写下(“你找到了密码!”)。
-希洛(85)。
但是任何熟悉prolog的人都会发现这可能是多么不正确。首先也是最重要的是,我们得到了一个算术错误,说秘密数不是一个函数。为了解决这个问题,我尝试将
secret\u number
作为参数发送,而不是将其作为“全局”变量使用(在我看来),但这似乎没有多大帮助。除此之外,我们还有一个目标(指令)失败,但我想在这种情况下这是理所当然的


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

首先,Prolog不执行
if
语句。每个谓词(您所调用的函数)都会对语句求值,并试图使其为真。如果存在多个可能的事实,则需要多个谓词。谓词也是自包含的。你不能期望一个谓词知道另一个谓词中的内容。这是一个更干净的代码版本(我没有测试它,也不能保证它能正常工作)


首先也是最重要的一点,Prolog不执行if语句。每个谓词(您所调用的函数)都会对语句求值,并试图使其为真。如果存在多个可能的事实,则需要多个谓词。谓词也是自包含的。你不能期望一个谓词知道另一个谓词中的内容。这是一个更干净的代码版本(我没有测试它,也不能保证它能正常工作)


例如,您可以使用ISO谓词和比较运算符只是原子这一事实来缩短代码

消息(,“过高”)。
消息(,'found!')。
希洛:-
读(猜),
机密编号(机密),
比较(C,猜测,秘密),
消息(C,Msg),
writeln(Msg)。
无论如何,如果ISO Prolog中的/then/else采用以下形式:

hilo(猜测):-
机密编号(机密),
(猜<秘密
->写(“太低!”)
猜>秘密
->写(“太高了!”)
写下(“你找到了秘密号码!”)
).

请注意,(潜在昂贵的)secret_number/1谓词只调用一次…

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

消息(,“过高”)。
消息(,'found!')。
希洛:-
读(猜),
机密编号(机密),
比较(C,猜测,秘密),
消息(C,Msg),
writeln(Msg)。
无论如何,如果ISO Prolog中的/then/else采用以下形式:

hilo(猜测):-
机密编号(机密),
(猜<秘密
->写(“太低!”)
猜>秘密
->写(“太高了!”)
写下(“你找到了秘密号码!”)
).

请注意,(潜在昂贵的)secret_number/1谓词只调用一次…

好的,公平。我测试了它,它似乎工作。但是我想我唯一不能理解的是为什么需要密码(Num)?在我看来,似乎你只需要取一个“变量”,把它分配给另一个,然后使用它的“副本”,如果你愿意的话?就像我前面说的,每个谓词只知道它本身是什么。如果需要其他信息,必须调用包含它的谓词。因此,作为规则调用
secret\u number(Num)
将查询
secret\u number
以查看使规则为真的
Num
的值是什么。这是获得密码值的唯一方法。(除非你只是想做
猜测<85
)。好吧,公平。我测试了它,它似乎工作。但是我想我唯一不能理解的是为什么需要密码(Num)?在我看来,似乎你只需要取一个“变量”,把它分配给另一个,然后使用它的“副本”,如果你愿意的话?就像我前面说的,每个谓词只知道它本身是什么。如果需要其他信息,必须调用包含它的谓词。因此,作为规则调用
secret\u number(Num)
将查询
secret\u number
以查看使规则为真的
Num
的值是什么。这是获得密码值的唯一方法。(除非你只是想做
Guess<85
)。
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).