2010-11-18 4 views

答えて

1

よくチェックすることはおそらくもっとうまくいくかもしれませんが、ちょっとしたことです。

even(N) :- 
    N mod 2 =:= 0.  

doubleeven([],[]). 
doubleeven([H|T], [H,H|Z]) :- 
    even(H), 
    !, 
    doubleeven(T,Z). 
doubleeven([H|T], [H|Z]) :- 
    doubleeven(T,Z). 
+0

ありがとうございました! Prologのリストは非常に奇妙です。 – Vidi

+0

@Vidi、何が変だ?リストは頭と尾( '[H | T]')で、テールもリストです。もっとシンプルにできませんでした。 –

+1

'doubleeven([2]、[2])。'は成功しますが、失敗するはずです。 – false

2

この回答に示すコードが reified test predicateeveninteger_truth/2に基づいています。ただ、完全を期すため

eveninteger_truth(I,Truth) :- 
    ( var(I)  -> throw(error(instantiation_error ,eveninteger_truth/2)) 
    ; \+integer(I) -> throw(error(type_error(integer,I),eveninteger_truth/2)) 
    ; 0 is I mod 2 -> Truth = true 
    ;     Truth = false 
    ). 

、のは同様に、あまりにも、ここoddinteger_truth/2を定義してみましょう:

oddinteger_truth(I,Truth) :- 
    ( var(I)  -> throw(error(instantiation_error ,oddinteger_truth/2)) 
    ; \+integer(I) -> throw(error(type_error(integer,I),oddinteger_truth/2)) 
    ; 1 is I mod 2 -> Truth = true 
    ;     Truth = false 
    ). 

if_/3およびeveninteger_truth/2に基づいて、integers_evendups/2

integers_evendups([],[]). 
integers_evendups([X|Xs],[X|Zs1]) :- 
    if_(evenintegers_truth(X), Zs1 = [X|Zs0], Zs1 = Zs0), 
    integers_evendups(Xs,Zs0). 

は、あなたがあなたの質問に与えたクエリを見てみましょう:別の方法として

 
?- Xs = [1,2,3,5,4], integers_evendups(Xs,Zs). 
Xs = [1, 2, 3,5, 4 ], 
Zs = [1,2,2,3,5,4,4]. 

、どのようの使用について? if_//3に基づいて、我々はevenintegerdups//1を定義します。

evenintegerdups([]) --> 
    []. 
evenintegerdups([X|Xs]) --> 
    if_(eveninteger_truth(X), [X,X], [X]), 
    evenintegerdups(Xs). 

我々はfoldl/4lambdasを使用する場合、コードはもっと簡潔に取得することができます:

:- use_module(library(lambda)). 

evenintegerdupsB(Xs) --> 
    foldl(\X^if_(eveninteger_truth(X),[X,X],[X]),Xs). 

はのはアクションでこれら2つのバリアントを見てみましょう

 
?- Xs = [1,2,3,5,4], phrase(evenintegerdups(Xs),Zs). 
Xs = [1, 2, 3,5, 4 ], 
Zs = [1,2,2,3,5,4,4]. 

?- Xs = [1,2,3,5,4], phrase(evenintegerdupsB(Xs),Zs). 
Xs = [1, 2, 3,5, 4 ], 
Zs = [1,2,2,3,5,4,4]. 
+0

一般的でない名前付け: 'Zs'と' Zs0'は通常相違に使用されます。ここには何もありません。したがって、 'Zs0'、' Zs1'がより適切でしょう。 – false

+0

@false。今の命名はいいですか? – repeat

+0

いいえ:そのように考える:そのように拡大できるDCGはありますか? – false

関連する問題