【问题标题】:My Prolog version doesn't seem to know member我的 Prolog 版本似乎不认识成员
【发布时间】:2013-10-15 22:36:12
【问题描述】:

我正在 Amzi 中尝试下一个示例!序言:

member(apple, [apple, broccoli, crackers]).

答案是否定的。

?- member(apple, [apple, broccoli, crackers]).
no

我的版本有问题吗?如果我在 swipl 中尝试相同的方法,那么它确实有效......

?- member(apple, [apple, broccoli, crackers]).
true .

阿姆齐! Prolog 使用自己的 Prolog 实现?

【问题讨论】:

标签: prolog amzi-prolog


【解决方案1】:

官方 ISO 标准中没有指定谓词 member/2,尽管 Prolog 实现经常提供该谓词。但是实现方式因系统而异。有些人将其作为内置谓词提供。其他作为库谓词。在 SWI-Prolog 的特定情况下,假设默认配置,member/2 谓词在模块 library(lists) 中定义,当其导出的谓词之一被调用时自动加载。默认情况下,自动加载是静默的,这通常会导致用户认为他们正在调用内置谓词。在Amzi的情况下! Prolog,似乎member/2 谓词不是内置的,但您可以轻松地自己定义它。为了检查给定谓词是否为内置谓词,您通常可以使用标准的predicate_property/2 谓词。例如,使用 SWI-Prolog,您会得到 member/2

?- predicate_property(member(_,_), Property).
Property = interpreted ;
Property = visible ;
Property = imported_from(lists) ;
Property = file('/Users/pmoura/lib/swipl-6.5.2/library/lists.pl') ;
Property = line_count(106) ;
Property = nodebug ;
Property = number_of_clauses(1) ;
Property = number_of_rules(1) ;
false.

但遗憾的是,并非所有系统都提供标准的predicate_property/2 谓词。不幸的是,Prolog 标准化并不是它的亮点之一。

【讨论】:

【解决方案2】:

我曾经使用过的每个 Prolog 版本都与其他版本略有不同...很高兴看到现在还有另一个需要考虑的版本,ISO Prolog :-)

我认为这个链接有很好的信息:http://osprey.unisa.ac.za/phorum/read.php?674,173265,173265

【讨论】:

  • 仅供参考:ISO Prolog 自 1995 年以来就在这里......有关更多信息,请参阅iso-prolog
  • 是的,但是那天我真的需要发泄一下标准:D xkcd.com/927
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2021-03-01
  • 2016-04-10
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多