我是Prolog的新手,这里有一个简单的代码来计算一个数字的结果与另一个数字的结果。 (X ^ Y)
这是代码。 power.pl
:
power(X,0,1).
power(X,Y,Z):- Y > 0, Y1 is Y-1, power(X,Y1,Z1), Z is X*Z1.
power(X,Y,Z):- Y < 0, Y1 is -1*Y, Y2 is Y1-1, X1 is 1/X, power(X1,Y2,Z1), Z is X*Z1.
当我尝试使用SWI-PROLOG
使用命令[power].
运行此操作时,它会给我Singleton variable: [X]
警告。
我发现(来自here)如果我在第一行使用power(_,0,1).
,那么事情就可以了。
此代码由我的老师提供,他真的不解释内容。但我得从learnprolognow.org学习基本的序言。我的老师说这个警告并不令人头疼,因为SWI-PROLOG是马车,并且一直在发出警告。我真的不买这个。我的意思是,它被如此广泛地使用,这可能是如此的错误?显示此警告必须有原因。
我的问题是:
1 - power(X,0,1)
是fact
,据我所知,我learnprolognow.org就是这样,所以,为什么会给出这个警告?在prolog
陈述variable
时,fact
是否希望我 使用 warning
?
2 - 我真的要担心这个//enter code here
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Book book)
{
if (ModelState.IsValid)
{
_context.Book.Add(book);
_context.SaveChanges();
return RedirectToAction("Index");
}
ViewData["AuthorID"] = new SelectList(_context.Set<Author>(), "AuthorID", "Author", book.AuthorID);
return View(book);
}
//enter code here
,或者只是让这件事发生。当显示警告时我不太舒服。这是一个警告。
很抱歉,如果我遗漏了有关此事的任何基本概念。我是新手。 谢谢。
答案 0 :(得分:3)
您提出的所有问题都会在您链接的问题中得到解答。
特别参见this answer,明确解释SWI发出警告的原因以及避免它的不同方法。它甚至链接到手册,该手册显示 SWI的行为完全符合记录和预期。
另请参阅this answer以获取在这种情况下也适用的更多信息:也许是时候将80s放在后面并使用更通用的算术,以便您可以在所有方向上使用代码。
简而言之:如其他答案中所述,将变量标记为单例以避免(通常非常有用)警告。
答案 1 :(得分:3)
从技术上讲,如果您真的希望编写代码,那么您就不会 去除单例警告。就像在其他语言中一样,如果您真的知道自己在做什么,可能会忽略警告。警告是存在的,因为编译器或解释器让你知道某些东西可能不正确。通常,编译器或解释器是正确的,并且它在程序员方面发现了错误(例如,拼写错误的变量)。或者它可能是现在可能有效的脆弱代码的标志,但在极端情况下可能会失败,或者在它周围稍作变化。
强烈建议您摆脱警告,以便您和其他可能必须阅读您的代码的人明确您的编程逻辑意图,并确保您有意识地做了某些事情并且没有错误。理想情况下,您唯一允许保留警告的时间是,如果您无法使用任何明确的编程结构来摆脱警告。警告的存在是一个不整洁或更极端草率的计划的一般迹象。
在这种特殊情况下,power(_, 0, 1).
表达的逻辑比power(X, 0, 1).
更好。 power(_, 0, 1).
表示,任何变量,权力0
,产生1
。取而代之的是power(X, 0, 1).
,其中变量X
被赋予权力0
,而不是产生1
,这引出了问题, Is有哪些具体的X
在这里没有说明?
当然,我们一直忽略0
取决于0
权力的未定义案例,所以真的应该是power(X, 0, 1) :- X =\= 0.
:)