【问题标题】:List of predicates in PrologProlog 中的谓词列表
【发布时间】:2012-05-02 08:20:47
【问题描述】:

是否可以定义一个由谓词组成的列表以及如何调用谓词。

另外,是否可以将一个谓词传递给另一个谓词(如传递原子)?

例子:

pre1:- something.
pre2(Predicate1, List):-
    call(Predicate1),
    append([Predicate1], List, R),
    .....

【问题讨论】:

  • 我想你正在寻找的答案在这里:stackoverflow.com/questions/8687306/…
  • @AndreiBogdan 我添加了一个示例来更好地说明我的意思。
  • 您可能想阅读this thing
  • @Mog 这很有希望,但我找不到任何例子
  • 您能更详细地解释一下您想要实现的目标吗?你已经在你的例子中提到了call/1,所以我看不出你还需要知道什么......

标签: list prolog


【解决方案1】:

您不能将 谓词 存储在列表中,但您可以存储 terms(或函子)并将术语称为 goals

这是一个谓词,用于测试一个术语是否具有由函子列表描述的属性:

has_properties([], _).
has_properties([P|Ps], X) :-
    Goal =.. [P, X],            % construct goal P(X)
    call(Goal),
    has_properties(Ps, X).

用法:

% is 4 a number, an integer and a foo?
?- has_properties([number, integer, foo], 4).

当然,此查询的答案取决于您对foo/1 的定义。如果需要,请查看我的explanation of =..

编辑:正如cmets中@false报告的那样,没有必要使用=..,因为Goal =.. [P, X], call(Goal)可以替换为call(P, X)会产生相同的效果。不过,可能仍然值得学习 =..,因为您可能会在其他人的代码中遇到它。

【讨论】:

  • 请考虑call(P, X) 而不是(=..)/2call/1!这样更快、更干净、更通用!
  • @false:好点。但是,SWI 手册建议 call/2 不在 ISO Prolog 中。
  • @larsmans:那本手册显然已经过时了。由于 Cor.2:2012 它是 ISO。请参考tag iso-prolog!
  • @larsmans:这是up-to-date SWI manual。好吧,很明显,为什么获得标准是必不可少的!
  • @larsmans:你的修改需要澄清一下:call(P,X)的版本更通用,所以效果不一样。 P 不需要是原子! P 可以是例如 between(1,10)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多