read()を使用してユーザー入力を取り込みます。私のプログラムは次の形式の入力を受け入れるように計画しました
a,b,c,d,e
次に、それを要素のリストに変換します。しかし、プロローグでテストを行うと、私はこれを手に入れました
26 ?- read(X).
|: abc,def,ghi,jkl.
X = (abc, def, ghi, jkl).
よくわかりませんが、これは構造を返しますか?これをリストに変換するにはどうすればよいですか?
(abc, def, ghi, jkl) は、ファンクター ',' とアリティ 2 を持つ項です。(=..)/2、functor/3、arg/3 などの項検査述語を使用して分解できます。または、 write_canonical/1 を試してください:
?- T = (abc, def, ghi, jkl), write_canonical(T).
','(abc,','(def,','(ghi,jkl)))
T = (abc, def, ghi, jkl).
このようなタプルをリストに変換するには、DCG を使用できます。
tuple_list((A,B)) --> !, tuple_list(A), tuple_list(B).
tuple_list(A) --> [A].
例:
?- T = (abc, def, ghi, jkl), phrase(tuple_list(T), Ls).
T = (abc, def, ghi, jkl),
Ls = [abc, def, ghi, jkl].
X =(abc、def、ghi、jkl)。
これは一連の記号です。プロローグは非型(int、long、double、...)を認識しません。
リストは、ヘッド(最初の要素)とテール(残りの要素)で表されます。次の例を実行してみてください。
?- [1,2,3,4,5,6]=[Head|Tail].
?- [1,2,3,4,5,6]=[First,Second|Tail].
ここで、再帰に慣れる必要があります(これはプロローグの中心です)。挿入手順は次のようになります。
insert(X, List, [X|List]).
しかし、リストが空の場合はどうなりますか。私たちの手順では、リストはそうではないと考えているため、前の手順で十分な別の手順が必要です。
insert(X, [], [X|]).
さらに多くのことができます。たとえば、アイテムがリスト内に存在するかどうかを確認します。
present(Item,[Item|_]).
present(Item,[_|Tail]) :-
present(Item,Tail).
最後の手順の再帰に注意してください:present(Item、Tail)-これは、キーボードから読み取ることができる変数Itemを使用して、リストの先頭を再帰的にチェックします。
check_if_present :- read(X), present(X, List).
ここで、リストは以前に作成されています。
リストを非常に簡単に連結することもできます。
concatenating([],List,List).
concatenating([Head|Tail],List,[Head|ResultedTail]) :-
concatenating(Tail,List,ResultedTail).