我正在阅读Pereira和Shieber 撰写的“序言和自然语言分析”(pdf)一书,在问题2.7中有一段评论:
在语义网络表示中,我们经常想问“福特与公司类别之间保持什么关系?”
修改语义网络的表示形式,以允许这种新类型的问题和上一个问题中的类型。提示:将语义网络关系视为Prolog个人。这是一项重要的Prolog编程技术,有时在哲学界称为“具体化”。
我不熟悉这种reification技术。
好,让我们假设这个事实和规则数据库:
isa('Ole Black', 'Mustangs').
isa('Lizzy', 'Automobiles').
isa('Ford','Companies').
isa('GM','Companies').
isa('1968','Dates').
ako('Model T', 'Automobiles').
ako('Mustangs', 'Automobiles').
ako('Companies', 'Legal Persons').
ako('Humans', 'Legal Persons').
ako('Humans', 'Physical Objects').
ako('Automobiles', 'Physical Objects').
ako('Legal Persons', 'Universal').
ako('Dates', 'Universal').
ako('Physical Objects', 'Universal').
have_mass('Physical Objects').
self_propelled('Automobiles').
company(X) :- isa(X,'Companies').
legal_persons(X) :- ako(X,'Legal Persons').
Run Code Online (Sandbox Code Playgroud)
如何编写一个查询,在上面找到的代码之间的关系'Ford',并'Companies'为isa?当然,我总是可以这样写
fact(isa, 'Ford','Companies').
Run Code Online (Sandbox Code Playgroud)
和查询,?- fact(X, 'Ford','Companies').但以某种方式我认为这不是正确的方法。
有人可以解释一下如何正确执行吗?
我知道如何通过库将 python 转换ast为jsonast2json
import ast
from ast2json import ast2json
node = ast.parse("2+3", mode='eval')
e = eval(compile(node,'<string>','eval')) # equals
node_j = ast2json(node)
Run Code Online (Sandbox Code Playgroud)
这给了我这个对象
{'_type': 'Expression',
'body': {'_type': 'BinOp',
'col_offset': 0,
'left': {'_type': 'Num', 'col_offset': 0, 'lineno': 1, 'n': 2},
'lineno': 1,
'op': {'_type': 'Add'},
'right': {'_type': 'Num', 'col_offset': 2, 'lineno': 1, 'n': 3}}}
Run Code Online (Sandbox Code Playgroud)
但如何将node_j对象转换回ast对象呢?
我有一个来自同情计算的表达式:
sqrt(pi)*(0.333333333333333*a + 0.333333333333333*b - 2.66666666666667*c**2)
Run Code Online (Sandbox Code Playgroud)
其中a,b,c是符号,并且想要解析它以便浮点数被替换为像in中的有理数
sqrt(pi)*(1/3*a + 1/3*b - 8/3*c**2)
Run Code Online (Sandbox Code Playgroud)
我知道如何手工完成,
In[24] Rational(str(0.333333333333333)).limit_denominator(1000)
Out[24]: 1/3
Run Code Online (Sandbox Code Playgroud)
但是我不太清楚如何解析原子并只挑选那些浮子,然后用有理数近似代替.
在表达式中进行这些替换的最明智的方法是什么?
我想问是否存在对偶数numpy的实现,或者目前正在制定任何计划,或者是否有任何维护良好的 python 包来实现这个代数。我发现了一些软件包,但它们要么没有维护,要么写得不好。到目前为止,我见过的最好的包是一个包。pypiMathematica