我想找到一首诗的押韵对联,所以我需要比较这首诗两节的最后一个音节。
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).
例如,我需要检查“ [他们把我放在烤箱里烤],“ [我,一个,被剥夺的,可怜的蛋糕]]押韵,所以我想我应该检查这两个列表的最后一个元素是否相同。
使用此代码,我试图比较列表中的第一个元素和最后一个元素,但是它们都不起作用。
答案 0 :(得分:1)
某些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).
您现在需要定义same_last_syllable /2
谓词。这将需要将一个单词分解成一个音节列表。这似乎并不简单(例如,参见https://www.logicofenglish.com/blog/65-syllables/285-how-to-divide-a-word-into-syllables),而且我不知道执行该操作的开源Prolog库。
答案 1 :(得分:0)
听起来您至少需要一种方法来识别列表的最后一个元素:
last_of( [X], X ).
last_of( [_|X], Y ) :- last_of(X, Y).