可愛的問題。它可以使用下面的代碼來解決:
% fail of the first element of each list don't unify
% or if one or both lists are empty
a2b([First| List1], [First| List2]) :-
% calculate the length of the second list
% while traversing both lists in parallel
a2b_first(List2, 1, N, List1, Rest1),
% check that the length of the rest of the first
% list is equal to the length of the second list
a2b_second(Rest1, N).
a2b_first([], N, N, Tail1, Tail1).
a2b_first([_| Tail2], N0, N, [_| Tail1], Rest1) :-
N1 is N0 + 1,
a2b_first(Tail2, N1, N, Tail1, Rest1).
a2b_second([], 0).
a2b_second([_| Tail1], N) :-
M is N - 1,
a2b_second(Tail1, M).
當然,還有一個更簡單的(但不是有趣的代碼!)解決方案:
% fail of the first element of each list don't unify
% or if one or both lists are empty
a2b([First| List1], [First| List2]) :-
length([First| List1], N1),
length([First| List2], N2),
N1 is 2 * N2.
的length/2
謂語通常可無論是作爲一個建在謂詞中或作爲圖書館謂詞。
對於學習Prolog,研究第一個解決方案很有趣。例如,它舉例說明了如何利用第一參數索引以及如何使用累加器來編寫尾遞歸(從而節省空間)的謂詞。
此外,第一個解決方案可以比第二個解決方案更高效。在第二種解決方案中,我們總是遍歷兩個列表以找到它們的長度。但是,在第一種解決方案中,這並非總是必要的。
您的解決方案表明,給定兩個空列表,其中一個是另一個的兩倍。但是你在正確的軌道上。 –
我絕對相信,如果第一個列表的長度爲零,第二個的長度爲零,則第一個長度是第二個長度的一個。 –
您發佈的子句如何爲空列表返回false?我無法得到那部分。 – BleachedAxe