The [Head|Tail]
您在定义中使用的列表的 Prolog 表示法same/2
谓词提供对列表的访问head and tail。列表的尾部本身就是一个(可能是空的)列表。但在你的情况下,你想访问第一个和第二个元素,你可以通过编写[First, Second| _]
(即通过枚举用逗号分隔的元素;这里我使用匿名变量对于尾巴,因为我们不需要它,因此我们可以忽略它)。
您的谓词可以通过将其重写为来修复:
same([F1,S1|_], [F2,S2|_]):-
F1 \== F2,
S1 == S2.
如果您知道参数始终是包含两个元素的列表,则可以将谓词简化为:
same([F1,S1], [F2,S2]):-
F1 \== F2,
S1 == S2.
调用示例:
?- same([josh,muse], [sam,muse]).
true.
?- same([sam,muse], [sam,muse]).
false.
?- same([josh,muse], [sam,maria]).
false.
最后一点,你的问题是关于术语平等但在您的解决方案尝试中您正在使用术语统一。它们具有不同的语义,不应混淆。