List 如何在prolog中将一个列表的最后一个元素与另一个列表的最后一个元素进行比较?

List 如何在prolog中将一个列表的最后一个元素与另一个列表的最后一个元素进行比较?,list,prolog,List,Prolog,我想找到一首诗的押韵对联,所以我需要比较这首诗的两首诗的最后一个音节 cmp([A|As], [B|Bs]) :- cmp(As, A, Bs, B). cmp(A, [B], B, [A]). cmp([_, A|As], X, [_, B|Bs], Y) :- cmp([A|As], X, [B|Bs], Y). 例如,我需要检查“[他们,放,我,在,烤箱,烤]”和“[我,一个,被剥夺的,和,可怜的,蛋糕]”是否押韵,所以我想我应该检查这两个列表的最后元素是否相同 使用此代码,我尝试比较

我想找到一首诗的押韵对联,所以我需要比较这首诗的两首诗的最后一个音节

cmp([A|As], [B|Bs]) :- cmp(As, A, Bs, B).

cmp(A, [B], B, [A]).
cmp([_, A|As], X, [_, B|Bs], Y) :- cmp([A|As], X, [B|Bs], Y).
例如,我需要检查“[他们,放,我,在,烤箱,烤]”和“[我,一个,被剥夺的,和,可怜的,蛋糕]”是否押韵,所以我想我应该检查这两个列表的最后元素是否相同


使用此代码,我尝试比较列表的第一个元素和最后一个元素,但这两个元素都不起作用。

听起来您至少需要一种方法来识别列表的最后一个元素:

last_of( [X], X ).
last_of( [_|X], Y ) :- last_of(X, Y).

一些Prolog系统提供了一个列表库,其中包含一个可以调用的
last/2
谓词。通常的定义是:

last([Head| Tail], Last) :-
    last(Tail, Head, Last).

last([], Last, Last).
last([Head| Tail], _, Last) :-
    last(Tail, Head, Last).
请注意,由于使用绑定列表调用谓词时第一个参数索引,此定义避免了错误的选择点

使用
last/2
谓词可以编写:

compare_verses(Versus1, Versus2) :-
    last(Versus1, Word1),
    last(Versus2, Word2),
    same_last_syllable(Word1, Word2).
现在需要定义
相同的最后一个音节/2
谓词。这需要将一个单词分解成一系列音节。这似乎并不琐碎(请参见示例),我也不知道有开源Prolog库可以执行它。

也许OP可以使用soundex或