Prologのリストで偶数を倍にする方法はありますか?例えば :プロローグを使用しているリストの要素が二重になっていますか?
X = [1,2,3,5,4]
結果は次のようになります
X = [1,2,2,3 、5,4,4]
ありがとうございます!
Prologのリストで偶数を倍にする方法はありますか?例えば :プロローグを使用しているリストの要素が二重になっていますか?
X = [1,2,3,5,4]
結果は次のようになります
X = [1,2,2,3 、5,4,4]
ありがとうございます!
よくチェックすることはおそらくもっとうまくいくかもしれませんが、ちょっとしたことです。
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).
この回答に示すコードが 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].
、どのようdcgの使用について? if_//3
に基づいて、我々はevenintegerdups//1
を定義します。
evenintegerdups([]) -->
[].
evenintegerdups([X|Xs]) -->
if_(eveninteger_truth(X), [X,X], [X]),
evenintegerdups(Xs).
我々はmeta-predicatefoldl/4
とlambdasを使用する場合、コードはもっと簡潔に取得することができます:
:- use_module(library(lambda)).
evenintegerdupsB(Xs) -->
foldl(\X^if_(eveninteger_truth(X),[X,X],[X]),Xs).
はのはアクションでこれら2つのdcgバリアントを見てみましょう
?- 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].
ありがとうございました! Prologのリストは非常に奇妙です。 – Vidi
@Vidi、何が変だ?リストは頭と尾( '[H | T]')で、テールもリストです。もっとシンプルにできませんでした。 –
'doubleeven([2]、[2])。'は成功しますが、失敗するはずです。 – false