抱歉标题含糊不清,但我找不到更具体的表达方式。
我正在努力完成 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。
谢谢