我有一個謂語,這是事實,如果通過對這樣的列表,例如:返回
translatable([(dog,perro)], [(perro,hund)], [(dog,hund)])
手段 - 如果「狗」轉化爲「佩羅」和「佩羅」翻譯去「尋找」,那麼「狗」轉化爲「尋找」的確是事實。
以下是完整的代碼。返回/表明對第一構件 - 給定((A,B),一個)返回true,給出((A,B)中,X)返回X = A:
first((First, _), First).
類似於 「第一」,但對於第二對成員:
second((_, Second), Second).
如果在元組的列表中存在翻譯的單詞本返回true,並保存翻譯翻譯:(狗,翻譯,[(牀,CAMA),(狗,佩羅)
translation_exists(Word, Translation, [H|T]) :-
first(H, Word), second(H, Translation), !;
translation_exists(Word, Translation, T).
並由此產生:
translatable(EnglishSpanish, SpanishGerman, EnglishGerman) :-
forall(member(Pair, EnglishGerman), (
first(Pair, Word),
second(Pair, ResultTranslation),
translation_exists(Word, Translation, EnglishSpanish),
translation_exists(Translation, ResultTranslation, SpanishGerman)
)).
該代碼正確返回true/false。 但是,爲什麼,給定 可翻譯([(狗,佩羅)],[(佩羅,hund)],X)。
它不返回X = [(dog,hund)]?
編輯 更具體的,實際的目標是: 找出如果說去年的字典裏翻譯對(並只)。 丹尼爾,非常感謝,我已經採納了你的建議成員函數 - 非常簡單,謝謝!這是我的所有代碼現在:
lastIsTranslatable(_, _, []).
lastIsTranslatable(EngSpan, SpanGerm, [(Eng, Germ) | T]) :-
member((Eng, Span), EngSpan),
member((Span, Germ), SpanGerm),
% this is to protect endless [(dog,hund), (dog, hund), ...]
not(member((Eng, Germ), T)),
lastIsTranslatable(EngSpan, SpanGerm, T),
!.
而且是,這個偉大的工程尋找真正的&假:
lastIsTranslatable([(a,b)], [(b,c)], [(a,c)]).
lastIsTranslatable([(a,b)], [(b,c)], [(a,no)]).
但
lastIsTranslatable([(a,b)], [(b,c)], X).
結果是X = [],然後,擊中「;」 - 錯誤。爲什麼? 那麼,與跟蹤選項運行,我看到執行失敗的
not(member((Eng, Germ), T))
但除此之外,導致X將無休止地充滿(A,C),(A,C)......也許有是更好的辦法保護重複?
要表示成對,請不要**使用逗號('A,B)'。相反,使用不同的函數,如「A-B」。 – repeat
使用列表的'translatable/3'有什麼意義? – repeat