为什么我的 Prolog 谓词不起作用,而它是 Clicksin & Mellish 中的谓词的精确副本?

问题描述 投票:0回答:0

抱歉标题含糊不清,但我找不到更具体的表达方式。

我正在努力完成 Clocksin & Mellish 的Prologing In Prolog(第 4 版,以防它有任何不同),并且卡在第 3.5 节,在那里他们实现了一个谓词

aless/2
,如果第一个参数为真按字母顺序小于第二个。例如,以下内容是正确的...

aless(a, b).
aless(ab, ac).

...但是以下是错误的(因为两个参数相等)...

aless(a, a).

我阅读了他们的规则(第 57 页),以及他们对使用

name/2
将字符串转换为整数列表的解释,并尝试自己编写代码。

当我的代码不起作用时,我翻页看他们是如何实现的,很高兴看到我做了和他们完全一样的事情(在变量名的选择范围内),包括他们添加的优化之后。

我的代码看起来像这样......

aless(W1, W2) :-
  name(W1, L1),
  name(W2, L2),
  alessx(L1, L2).

alessx([], [_|_]).
alessx([H1|_], [H2|_]) :- H1 < H2.
alessx([H,T1], [H,T2]) :- alessx(T1,T2).

除了他们使用像

X
Y
等变量名,我认为描述性不强外,我的代码似乎与他们的完全相同。但是,尽管以下内容是正确的...

aless(a, b).

..这是错误的...

aless(ab, ac).

有人能解释为什么我的代码不起作用吗?

以防万一,我在 Windows 11 上使用 SWI Prolog 9.0.4。

谢谢

prolog
© www.soinside.com 2019 - 2024. All rights reserved.