私はPrologを初めて使い、1または-1の値を持つ一連のシンボルを持つ問題を解決しようとしました。私が必要とするのは、一度に1つの要素をすべて一緒に追加し、最初の合計がどのインデックスで0より下に下がるかを抽出することです。私は命令的な背景から来ているので、カウント変数とfor-loopであるが、明らかに私はPrologでそれを行うことはできない。私は本当にこれまで管理してきたProlog:一度にリストの1つの要素を合計する
value('(', 1).
value(')', -1).
main(R) :- readFile("input", R), ???
readFile(Path, R) :-
open(Path, read, File),
read_string(File, _, Str),
stringToCharList(Str, Xs),
maplist(value, Xs, R).
stringToCharList(String, Characters) :-
name(String, Xs),
maplist(toChar, Xs, Characters).
toChar(X, Y) :- name(Y, [X]).
あなたが見ることができるように、すべてのシーケンスを含むファイルを読み込み、1と-1,2に変換することです。私はここからどこに行くのか分かりません。私はこの問題は3倍であると仮定します
- 私はリストに
- を、各要素を合計する必要がリスト
- を反復処理する必要があり、私は特定のインデックスに
を返却する必要があります助言がありますか?私は何とか反復がゼロ以下の合計を落としたリストを切り捨てて、ちょうどその長さを返すことができますか?
何あなたの入力ファイルが見えますか?それが有効なProlog用語または用語である場合、Prolog I/Oはそれらを読み取るだけで、解析する必要はありません。 – lurker
ちょうど長い括弧の文字列。 – SindreKjr
1と-1のリストがあるので、単純な再帰述語を実行してリストを歩き、0を押すまで合計を累積します。カウンタがインデックスになります。 'index_at_zero_sum(L、Index): - index_at_zero_sum(L、0、Index).'を開始します。 2番目の引数は当初の合計であり、もちろん '0'です。あなたの 'index_at_zero_sum/3'は再帰的になり、合計が0になったときに終了します。それ以外の場合はデフォルトで失敗します(ゼロの合計を達成しませんでした)。 – lurker