2012-02-08 13 views
0

2つのリスト(同じ長さ)で、同じ位置にある要素の数を計算したいと思います。 例: A = [3,6,7,9]とB = [2,6,4,9]のリストを持っているとします。メッセージに「2頭の雄牛が見つかりました。 "Prolog、counter

これまでのところ私はこの作られています

bulls([],[]). 
bulls([Ha|Ta],[Hb|Tb]) :- 
    Ha = Hb, 
    writeln('bull found'), 
    bulls(Ta,Tb); 
    bulls(Ta,Tb). 

たびに両方のリストで、同じ場所に存在する要素を、メッセージ「牛が見つかりました。」印刷されます。 そして、私の心の中で私はこのような何か作りたい:

bulls([],[],_). 
bulls([Ha|Ta],[Hb|Tb],Counter) :- 
    Ha = Hb, 
    NewCounter is Counter + 1, 
    bulls(Ta,Tb,NewCounter); 
    bulls(Ta,Tb,NewCounter). 

bulls(List1,List2):- bulls(List1,List2,0). 

bullsは、リスト2にそれを渡し、別のルールから呼び出されます。 どうすれば '雄牛'の値を画面に表示するのですか?どんな助け?


編集 ので好きのポストした後、私はこのテストプログラムのテスト2つのリスト作っ:

bulls([],[],X), write(X), write('bulls found'),fail. 
bulls([Ha|Ta],[Hb|Tb],Counter) :- 
    Ha = Hb, 
    NewCounter is Counter + 1, 
    bulls(Ta,Tb,NewCounter); 
    bulls(Ta,Tb,NewCounter). 

check(List1,List2):- 
    bulls(List1,List2,0). 


start:- 
    A=[1,1,1,1], 
    B=[2,1,2,1], 
    writeln(A),writeln(B), 
    check(A,B). 

を、私は

1 ?- start. 
[1,1,1,1] 
[2,1,2,1] 
ERROR: bulls/3: Arguments are not sufficiently instantiated 

この結果を得る私は何をやっています違う?

答えて

1

編集したプログラムについて:

最初の節は句ではなく、目標です!

bulls([],[],X) :- write(X), write(' bulls found'). 

fail、btwを削除してください。

第二節では、あなたは "IF-THEN-ELSE" を使用し、 "それ以外" -branchにCounter代わりのNewCounterを使用する必要があります。

bulls([Ha|Ta],[Hb|Tb],Counter) :- 
    (
    Ha == Hb 
    -> 
    NewCounter is Counter + 1, 
    bulls(Ta,Tb,NewCounter) 
    ; 
    bulls(Ta,Tb,Counter) 
). 
+0

はあなたの助けをいただき、ありがとうございます。いいえ、私はエラーは表示されませんが、出力は私が期待していたものではありません。私は冗談を '1? - 始める。 [1,1,1,1] [2,1,2,1] false.' –

+0

ありがとうございます。それはうまく動作します! –

0

述語がfindAllのと仮定すると、長さ、 nth0があなたのプロローグの実装に存在します。
(以下トレースがSWI-プロローグからである)

A = [3,6,7,9], 
B = [2,6,4,9], 
findall(Y, ((nth0(X, A, Y), nth0(X, B, Y))), Y), 
length(Y, LenY), 
write(LenY), write(' Bulls Found'). 

[trace] ?- A = [3,6,7,9], 
B = [2,6,4,9], 
findall(Y, ((nth0(X, A, Y), nth0(X, B, Y))), Y), 
length(Y, LenY), 
write(LenY), write(' Bulls Found'). 
    Call: (7) _G2814=[3, 6, 7, 9] ? creep 
    Exit: (7) [3, 6, 7, 9]=[3, 6, 7, 9] ? creep 
    Call: (7) _G2829=[2, 6, 4, 9] ? creep 
    Exit: (7) [2, 6, 4, 9]=[2, 6, 4, 9] ? creep 
^ Call: (7) findall(_G2834, (nth0(_G2832, [3, 6, 7, 9], _G2834), nth0(_G2832, [2, 6, 4, 9], _G2834)), _G2834) ? creep 
    Call: (13) lists:nth0(_G2832, [3, 6, 7, 9], _G2834) ? creep 
    Exit: (13) lists:nth0(0, [3, 6, 7, 9], 3) ? creep 
    Call: (13) lists:nth0(0, [2, 6, 4, 9], 3) ? creep 
    Fail: (13) lists:nth0(0, [2, 6, 4, 9], 3) ? creep 
    Redo: (13) lists:nth0(_G2832, [3, 6, 7, 9], _G2834) ? creep 
    Exit: (13) lists:nth0(1, [3, 6, 7, 9], 6) ? creep 
    Call: (13) lists:nth0(1, [2, 6, 4, 9], 6) ? creep 
    Exit: (13) lists:nth0(1, [2, 6, 4, 9], 6) ? creep 
    Redo: (13) lists:nth0(_G2832, [3, 6, 7, 9], _G2834) ? creep 
    Exit: (13) lists:nth0(2, [3, 6, 7, 9], 7) ? creep 
    Call: (13) lists:nth0(2, [2, 6, 4, 9], 7) ? creep 
    Fail: (13) lists:nth0(2, [2, 6, 4, 9], 7) ? creep 
    Redo: (13) lists:nth0(_G2832, [3, 6, 7, 9], _G2834) ? creep 
    Exit: (13) lists:nth0(3, [3, 6, 7, 9], 9) ? creep 
    Call: (13) lists:nth0(3, [2, 6, 4, 9], 9) ? creep 
    Exit: (13) lists:nth0(3, [2, 6, 4, 9], 9) ? creep 
^ Exit: (7) findall([6, 9], user: (nth0(_G2832, [3, 6, 7, 9], [6, 9]), nth0(_G2832, [2, 6, 4, 9], [6, 9])), [6, 9]) ? creep 
    Call: (7) length([6, 9], _G2848) ? creep 
    Exit: (7) length([6, 9], 2) ? creep 
    Call: (7) write(2) ? creep 
2 
    Exit: (7) write(2) ? creep 
    Call: (7) write(' Bulls Found') ? creep 
Bulls Found 
    Exit: (7) write(' Bulls Found') ? creep 
A = [3, 6, 7, 9], 
B = [2, 6, 4, 9], 
Y = [6, 9], 
LenY = 2.