λProlog 拒绝假设推理查询?

λProlog rejecting hypothetical reasoning queries?

我怀疑 λProlog 的主要实现 teyjus 可能有点被遗弃,但 λProlog 是一个令人着迷的 Prolog,它应该让你使用高阶逻辑、假设推理和其他东西,这就是为什么我正在尝试使用它。

文件“example.sig”:

sig example.

kind person, language type.

type hans person.
type german, french, italian language.

type grade person -> o.
type take person -> language -> o.

文件“example.mod”:

module example.

(grade P) :- (take P german), (take P french).
(grade P) :- (take P german), (take P italian).

take hans french.

然而,当我编译并加载它时,虽然它似乎可以工作,但假设推理查询被拒绝:

[example] ?- take X Y.

The answer substitution:
Y = french
X = hans

More solutions (y/n)? y

no (more) solutions

[example] ?- grade X.

no (more) solutions

[example] ?- (take hans german) => (grade hans).
(1,19) : Error : Symbol => is not permitted within terms

我原以为最后会有一个“是”。我做错了什么?

将“example.sig”扩展为:

type whatif language -> o.

将“example.mod”扩展为:

(whatif Q) :- ((take hans Q) => (grade hans)).

然后它起作用了:

看起来 λProlog 是一个惰性软件,我提出了一个问题 #122
或者有一些基本的问题,它不起作用,
比如打字问题或编译器优化?

P.S.: 我过着危险的生活,从这里下载了tjsim.exe等..:
http://www.eecs.ucf.edu/~leavens/Windows/usr-local-bin/

当前版本的 Teyjus 不允许将查询中的含义直接输入到顶层。 Gopalan Nadathur 和我 (Programming with Higher-Order Logic) 的书在附录中提到了这个问题和解决方法(见下面的摘录)。

A.4.2 与本书假定语言的偏差(第 287 页)

[...]

Teyjus 不允许在顶级目标中使用含义。当编译模型也扩展到这些目标时,这个特性在未来可能会改变,但就目前而言,这意味着一些例子,例如,在第 3.2 节中,不能 运行 直接使用这个系统。请注意,暗示仅在顶级目标中是不允许的:它们可以在出现在程序子句主体中的目标中自由使用。因此,可以通过首先构建合适的程序子句然后使用它来提出所需的查询来克服此限制。例如,而不是提出查询

?- p a => p b => p X.

可以创建子句

test X :- p a => p b => p X.

然后使用查询

?- test X.