2016-04-23 12 views
0

私はプロローグのロスタシステムプロジェクトに取り組んでいます。変更された検索を使用し、教授が提示した例に基づいて構造を挿入しています。しかし、私が実装を実行しようとすると、他の要素がない場合でも、提供されたレコードリストは決してロスタに挿入されません。私はプロローグにあまり慣れていないので、この問題は私をループに投げかけています。次のように検索/挿入方法のリストのリストにプロローグを挿入する

私の実装では、次のとおり

search(_, [], 0). 
search([X,_,_], [[X, _, _]|_], 1). 
search([_,Y,_], [[_, Y, _]|_], 1). 
search([X,Y,Z], [[_, _, _]|T], C) :- search([X, Y, Z], T, C). 
searchinsert([X, Y, Z], L, L) :- search([X, Y, Z], L, 1). 
searchinsert([X, Y, Z], L, [[X, _, _] | L]) :- search([X, Y, Z], L, 0). 
searchinsert([X, Y, Z], L, [[_, Y, _] | L]) :- search([X, Y, Z], L, 0). 

設計として第一又は第二の要素は、名簿内の他の要素と一致いずれかの場合、それが設けられたレコードのリストを拒否すべきです。次のように関数が呼び出されます。

process(4, X) :- 
    nl, 
    write('\tInsert student into roster.'), nl, 
    read_student_info([A, B, C]), 
    nl, nl, searchinsert([A, B, C], X, X). 

答えて

0

はたぶんただ最後の呼び出しを変更:

..., searchinsert([A, B, C], X, 1). 

ので、Xは、リストにインスタンス化する機会を持っています。しかし、プロセス/ 2ドライバの 'データフロー'を再考する必要があります。おそらく、引数がありません。

+0

どのような議論が行方不明になると思いますか?私がプロセス/ 2ドライバーに導いた唯一の情報は、ロスター自身です。 –

+0

Prologでは、変数は「assign once」です。ですから、/ 2に渡された別の変数が必要になるかもしれません。更新されたロスタを取得する必要があります。 – CapelliC

関連する問題