Prolog程序返回yes而不是value

Kos*_*sis 5 prolog

我得到了以下事件:项目(C,X,G,P) ,(其中,C是针对该产品的数量,X它的名字,G它的价格,P它的成本).
当我item(n3001,_,_,P)直接在prolog控制台上使用命令时我会得到答案,
G = 1.25 X = 100但是当我写出等式时,p3(C)-: item(C,_,_,P).我会查阅我得到的文本作为答案yes.
我澄清的问题是,有一次我得到了P我想要的价值,而另一次我得到的是真是假?

tas*_*tas 6

Prolog中没有返回值,p3/1不构成函数,而是构成关系.你的定义

p3(C) :-
   item(C,_,_,P).
Run Code Online (Sandbox Code Playgroud)

读:如果item(C,_,_,P)成功,那么也p3(C)成功.为了论证,我们假设您的代码包含以下事实:

item(n3001,100,1.25,1).
Run Code Online (Sandbox Code Playgroud)

如果你查询

?- p3(n3001).
Run Code Online (Sandbox Code Playgroud)

Prolog统一C了你的规则,n3001然后尝试你的目标item(C,_,_,P)成功.因此规则成功,Prolog告诉你:

   ?- p3(n3001).
yes
Run Code Online (Sandbox Code Playgroud)

如果您想知道对应的价格,n3001您还必须定义规则P头部中出现的规则,例如:

p3(C,P) :-
   item(C,_,_,P).
Run Code Online (Sandbox Code Playgroud)

如果您查询,您将看到P对应的值n3001:

   ?- p3(n3001,P).
P = 1
Run Code Online (Sandbox Code Playgroud)

如果您查询item/4直接P出现在参数中,那么您将看到满足您的查询的替换它:

   ?- item(n3001,_,_,P).
P = 1
Run Code Online (Sandbox Code Playgroud)

  • 也可以将谓词视为从术语到布尔值的函数 - 即true(是)和false(否).在任何情况下,没有"输出"参数,信息是非常有限的. (3认同)
  • @ lambda.xy.x:是的,你是对的.但我的观点是,除非你想看一个谓词是否适用于一个特定的(元组)参数,你将把一些参数作为变量并让Prolog计算它们.因此,在函数和返回值方面考虑谓词通常不是很有帮助,就像在其他编程范例中那样. (3认同)
  • @ lambda.xy.x:虽然对,你提到的观点模糊了答案和逻辑变量的实际点,因为它很容易误读为:这里没有什么新东西与函数相比. (3认同)