簡體   English   中英

從Prolog中的遞歸謂詞輸出最終列表

[英]Outputting final list from recursive predicate in Prolog

我寫了一個程序,找到Prolog列表中最長的互質子序列(它還不完美):

longest_lcs([A, B | Tail],X) :- gcd(A,B,1),lcs([B | Tail],X,A,1).
longest_lcs([A, B | Tail],X) :- lcs([B | Tail],X,A,0).

lcs([],G,_,_) :- rev(G,G1),write(G1).

lcs([A, B | Tail],G,Q,_) :- gcd(B,Q,1), gcd(A,B,1), lcs([B | Tail], [Q | G], A, 1),!.
lcs([A, B | Tail],G,Q,_) :- gcd(B,Q,1);gcd(A,B,1), lcs([B | Tail], [Q | G], A, 0).

lcs([A, B | Tail],G,_,0) :- gcd(A,B,1), lcs([B | Tail], G, A, 1).
lcs([A, B | Tail],G,_,1) :- lcs([B | Tail], G, A, 1).
lcs([A, B | Tail],G,_,0) :- lcs([B | Tail], G, A, 0).

lcs([A],G,Q,_) :- gcd(Q,A,1),lcs([], [A, Q | G], _, _).    

目前我用write謂詞輸出子序列,但我需要它以下面的方式運行:

?- longest_lcs([1,2,3,4],X).
X = [1,2,3,4]

?- longest_lcs([2,4,8,16],X).
X = []

我需要做哪些修改,這樣有效嗎?

你為什么要使用write / 1? 專注於對你想要的明確的陳述性描述,並且頂層將為你寫作。 最長的互質子序列的可能公式是:它是一個互質子序列,沒有其他互質子序列更長。 代碼看起來與此類似:

list_lcpsubseq(Ls, Subseq) :-
    list_subseq(Ls, Subseq),
    coprimes(Subseq),
    length(Subseq, L),
    \+ ( list_subseq(Ls, Others), coprimes(Others), length(Others, O), O > L ).

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM