【问题标题】:Prolog "," operator not working as intended?Prolog“,”运算符未按预期工作?
【发布时间】:2020-07-03 15:40:39
【问题描述】:

我对 prolog 非常不熟悉,但我在学校项目中需要它。因此,如果我使用不清楚的语言或不正确的术语,请谅解。我的麻烦是我的代码根本没有按我的预期工作。这是我在知识库中的一些代码:

output(mn,hp,hp,hp). 
output(hn,mn,hp,lp).
output(ln,hp,mp,hp).
input(lp,mp,mp,lp):-output(hn,mn,hp,lp).

这是我的查询:

?- input(X,mp,mp,lp),output(hn,mn,hp,lp).

我希望它返回 X = lp,就像知识库中的 if-then 语句一样。但是,它返回X=hpX=mpX=lp,这不是我想要的。 我使用“trace”来查看它是如何推理的,并且我看到它需要其他输出。我认为“,”运算符的意思是“和”,因此它只会查找具有值(hn、mn、hp、lp)的输出。如何让我的代码只查找具有正确输出值的 if-then 语句?是我对“,”运算符的理解有误,还是因为我的知识库问题?


编辑:这是我在 SWISH 中的代码的链接:https://swish.swi-prolog.org/p/i%20wanna%20bash%20my%20head%20in.pl#&togetherjs=AQ4zzkAQk4


编辑 2:我对这个项目的目标如下:我试图用这个程序解释一个模糊的认知图。我希望程序在给定输出概念的情况下确定缺失输入概念的值。因此,我需要程序在 output() 中查找具有正确值的子句,然后确定相关 input() 中的值。

【问题讨论】:

  • 既然你被添加了 [swi-prolog-for-sharing] 标签,你是在 SWISH 中这样做的吗?你能链接到你的程序吗?我在swish.swi-prolog.org/p/QlAbitSc.pl 重建了它,它的行为与您预期的一样。我没有看到您看到的多个错误答案。
  • @IsabelleNewbie 您好,感谢您的回答!我确实在 SWISH 中这样做。这是链接,希望它有效。 swish.swi-prolog.org/p/… 我认为我有大量的 if-then 语句是问题所在,但我不能确定。
  • 当我运行 您问题中的代码时,我确实得到了X = lp.。请在您的问题中包含您的问题的minimal reproducible example - 请不要链接到外部网站。

标签: prolog


【解决方案1】:

整个程序(88行):

?- output(hn,mn,hp,lp).
true.

因此,这可以在您的查询中完全忽略 - 它是 true 无论如何(仅限常量)并且没有进一步的影响。

那么重要的是:

?- input(X,mp,mp,lp).
X = mp ;
X = lp ;
X = hp ;
false.

不需要 Prolog。使用文本搜索确认:

$ grep "mp,mp,lp" proggy.pl

input(mp,mp,mp,lp):-output(mn,hp,hp,hp).
input(mp,mp,lp,hp):-output(hn,lp,hp,hp).
input(mp,mp,lp,mp):-output(hn,mp,hp,hp).
input(lp,mp,mp,lp):-output(hn,mn,hp,lp).%this one is a pain in my ass
input(hp,mp,mp,lp):-output(ln,hp,mp,hp).
input(mp,mp,lp,lp):-output(ln,hp,mp,hp).

以上,这三行

input(mp,mp,mp,lp):-output(mn,hp,hp,hp).
input(lp,mp,mp,lp):-output(hn,mn,hp,lp).%this one is a pain in my ass
input(hp,mp,mp,lp):-output(ln,hp,mp,hp).
      <-><------> 
       X   MATCH

将匹配查询:来自mn,hn,lnX 的3 个结果。

按预期工作。

【讨论】:

  • 感谢您为我提供解决方案。不幸的是,我认为这不适用于我的目的,我绝对应该将其包含在我原来的问题中。我试图用这个程序解释一个模糊的认知图。我希望程序在给定输出概念的情况下确定缺失输入概念的值。因此,我需要程序在 output() 中查找具有正确值的子句,然后确定相关 input() 中的值。不过我还是会考虑你的解决方案,非常感谢!
【解决方案2】:

这是一个更简单的查询:

?- input(X,mp,mp,lp).

这样成功了3次:

X = mp ;
X = lp ;
X = hp ;
false.

我假设您理解这是为什么:input 有几个匹配子句,X 的值不同,并且正文成功。

现在,您是对的,, 是连词,并且一般而言,目标A, B 的成功率低于单独的AB,但永远不会更频繁。 AB 通常相互约束。但是,非常重要的是:如果AB 不共享任何变量,那么它们是独立的。 在这种情况下,答案序列将是@987654336 答案的笛卡尔积@ 和B 的答案。如果单独A成功N次,单独B成功M次,那么没有共享变量的A, B会成功N*M次。

如果OtherGoal 还包含X 的出现,您只能期望看到更少的解决方案来解决?- input(X,mp,mp,lp), OtherGoal. 形式的查询。在您的查询中,情况并非如此。第一个合取成功了 3 次,第二个合取成功了 1 次,所以总体上你有 3 * 1 = 3 次成功,正如你所观察到的。

所以问题是:您想通过查询表达什么?你不能表达类似“给我input的解决方案,但只能通过应用output的某些子句”。

【讨论】:

  • 您好,感谢您的回答!我对这段代码的总体目标是为模糊认知图建立一个解释机制。给定输出概念的期望值和一些输入概念的值,我希望程序确定剩余输入概念的值。我试着去掉教授提供的代码,当规则很少时它可以工作,但当规则很多时它也会给出错误的答案。不过,感谢您的解释,我现在明白为什么我的查询对我不起作用了。
  • 我不太明白你想做什么。也许您想要存储output_input(output(hn,mn,hp,lp), input(lp,mp,mp,lp)). 形式的规则,然后您可以使用给定的输出和部分输入作为?- output_input(output(hn,mn,hp,lp), input(X,mp,mp,lp)). 来查询它并得到X = lp
  • @been 我认为你应该问一个单独的问题。但是你可以看看我和我的同事最近开发的库,也许 RCGA 算法适用于你的问题。关于这个库的文章在这里:arxiv.org/abs/2111.12749v1 可以通过 pip 安装包 pypi.org/project/fcmpy Git repo github.com/SamvelMK/FCMpy欢呼!
猜你喜欢
  • 2015-05-11
  • 2019-06-20
  • 2021-04-13
  • 2020-12-29
  • 2021-04-30
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多