【问题标题】:Prolog - deconstructing goals into individual facts and arithmeticProlog - 将目标解构为单个事实和算术
【发布时间】:2014-01-26 00:00:21
【问题描述】:

我正在尝试编写一个小程序,将给定的目标分解为所有最小的部分并最终评估它们。到目前为止,我有:

alien(X) :- fromMars(X), fromSaturn(X); fromJupiter(X), X = 'john'.

fromMars(john).
fromSaturn(john).
fromJupiter(john).

test(true) :- !.
test((Goal1,Goal2)) :- test(Goal1), test(Goal2).
test((Goal1;Goal2)) :- test(Goal1), test(Goal2).
test(X = Y) :- call(X = Y).
test(Goal) :- clause(Goal,Body),test(Body).

据我所知,这将递归地检查使用条款/2 的规则,例如如果我打电话给 test(alien(john)). 。当它达到Body 仅包含诸如fromMars(X), fromSaturn(X); fromJupiter(X), X = 'john' 之类的事实时,它将使用test((Goal1,Goal2)) :-test((Goal1;Goal2)) :- 规则拆分这些事实,最终达到单一事实。当传递一个奇异事实时,如果可以解决,则 Clause/2 将实例化 Body 为 true。

算术会出现问题。在上面的程序中,最终会有一个单一的目标X = 'john' 这会导致条款/2(私有过程?)的错误。我引入了规则test(X = Y) :- 来捕捉这种情况,这样我就可以用另一种方式处理它。然而,我真正想要的是一个可以捕捉所有算术的规则。显然,我不能以test(X = Y) :- 的风格编写规则来捕获所有可能的算术类型。

我的目标是最终编写一个可以处理任何类型的规则的可溯源元解释器。

如果这些都没有任何意义,请告诉我,我会尽力澄清:)

【问题讨论】:

  • 在 Prolog 中 = 是统一运算符,算术由 is 关键字处理,例如X is Y + 1.

标签: prolog


【解决方案1】:

元解释器是 Prolog 的“强项”之一。请参阅 Markus Triska 的 this page 了解这个有趣的主题。

正如 Little Booby Tables 建议的那样,您可以用简单的东西来捕捉算术

test(X is Y) :- X is Y.

顺便说一句,我认为你这里有一个错字

test((Goal1;Goal2)) :- test(Goal1), test(Goal2).

应该是

test((Goal1;Goal2)) :- test(Goal1) ; test(Goal2).

编辑:如果需要,可以推广使用运算符。只是所需内置函数的一个示例:

?- X = (1+2), X =.. [F, A, B], current_op(U, V, F).
X = 1+2,
F = (+),
A = 1,
B = 2,
U = 200,
V = fy .

【讨论】:

  • 有没有一种简单的方法可以捕获诸如 X
  • 你总是可以call(Goal),这可以作为一个包罗万象的规则。否则,您可以使用 current_op/3 和 =../2,请参阅我的编辑。这取决于你的目标......
猜你喜欢
  • 2012-11-30
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多