私はプロローグについて学び始めました。私は完全に混乱しています。Beginner Prolog:Predicate Logicと(多分)構文の問題
以下のシナリオを考えてみましょう。私は、人に関する事実を含む知識ベースを、フォーマット担当者(名前、年齢)と一緒に持っています。
例:
person(brad,20).
person(lindsey,15).
person(sophie,18).
person(charles,24).
私は年齢の合計がさらに40を超えた場合にtrueに評価されますルールを作成するには、照会あれば、それは出力/年齢の人々の名前が表示されますすべてのソリューションを取得するには、
addsto40(X,Y,Sum) :- person(X,A), person(Y,B), Sum is A + B, Sum > 9.
私はそれが年齢40より大きい数まで追加二人の名前を返し、次の(私はクエリヒット:だから40まで追加し、私はこれを試してみました)。クエリの例:
X = brad,
Y = charles,
Sum = 44 ;
X = sophie,
Y = charles,
Sum = 42 ;
X = charles,
Y = brad,
Sum = 44 ;
X = charles,
Y = sophie,
Sum = 42 ;
X = Y, Y = charles,
Sum = 48.
しかし、これは、二つの対に出力を制限:
?- addsto40(X,Y,Sum).
このクエリはfollwingを返します。私はそれに制限がないようにしたい、答えは例えば:brad、lindsey、sophieを含むことができる。
私はいくつかの失敗した解決策を試しました。私はaddsto40/3を実装し、合計が40に達するまで1人増やすことを考えました。しかし、それがうまく動作するようには機能しません。
addsto40(X,Y,Sum) :- person(X,A), person(Y,B), Sum is A + B, Sum < 40, addper(P,Sum,Newsum).
addsto40(X,Y,Sum) :- person(X,A), person(Y,B), Sum is A + B, Sum > 40.
addper(Y,Sum,Newsum) :- person(Y,X), Newsum is Sum + X, Newsum < 40, addper(P,Newsum,someSum).
addper(Y,Sum,Newsum) :- person(Y,X), Newsum is Sum + X, Newsum > 40.
私は正しい方向に誘導することができますか?なぜこれは機能しないのですか?解決策は何とかリストを実装することにありますか?プロローグの初心者のためのヒントやトリックはありますか?私はどんな種類の助けにも感謝します。ありがとうございました?
あなたが40より大きい 以下1はあなたのアプローチに似てそれを行うかもしれない方法であるが、代わりにリストを使用して、年齢の合計の人々のリストを取得しようとしているので、あなたはおそらく、リストを使用する必要があります
私を助けてください! –