prolog - 是否有必要删除"单例变量"陈述事实时发出警告?

时间:2015-11-24 15:53:42

标签: prolog singleton

  

在将此问题标记为重复之前,请注意我在SO处遇到了类似的问题herehere,但我的问题有点不同。

我是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 ,或者只是让这件事发生。当显示警告时我不太舒服。这是一个警告

很抱歉,如果我遗漏了有关此事的任何基本概念。我是新手。 谢谢。

2 个答案:

答案 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.:)