2016-07-15 7 views
1

私はProlog(SWI-Prolog)で演奏を開始することに決めました。私はプログラムを書いて、今は単純な主述語を書こうとしているので、.exeを作成してコマンドラインからプログラムを実行することができます。そうすれば、プロローグGUIではなく、コマンドラインから真偽の関係を見つけることができます。しかし、私は主な述語に実際に何が入っているのかを理解することができません。Prologのシンプルメイン述語例

mother(tim, anna). 
mother(anna, fanny). 
mother(daniel, fanny). 
mother(celine, gertrude). 
father(tim, bernd). 
father(anna, ephraim). 
father(daniel, ephraim). 
father(celine, daniel). 

parent(X,Y) :- mother(X,Y). 
parent(X,Y) :- father(X,Y). 
ancestor(X, Y) :- parent(X, Y). 
ancestor(X, Y) :- parent(X, Z), ancestor(Z, Y). 

まず試し:ここでは、これまでのプログラムである
は私がfamily_func() .Thenと呼ばれる述語に関係定義のすべてを置くが、私はmainを入力して、メインからその関数を呼び出そうとしました。コマンドラインに入力します。

family_func():- 
    mother(tim, anna). 
    ... 

    parent(X,Y) :- mother(X,Y). 
    ... 

main:- 
    family_func(). 

2回目の試行:私は述語を作成したが、その代わりに、プログラムは、このエラーを開始する前に、私が行ったような関係を見つけることを開始することができると期待:コードここ

ERROR: c:/.../ancestor.pl:18:0: Syntax error: Operator expected 

です:
私はすべての定義をメイン述語に入れようとしました。私はmainをタイプできると思った。プログラムを一時停止して(私はあなたがプログラムを実行し、ユーザーの入力を待つJavaのように)句の入力を開始するのを待ちます。代わりに、私がmainをタイプしたとき、それはfalseを返しました。

質問1:
私はJavaでコードを書くことに慣れています。だから、私の心の中で、私が試した最初のことはうまくいくはずです。私は基本的にローカル変数をfamily_func()に定義し、それらの変数間の関係を見つけるより小さい「メソッド」(つまりparent(X,Y) :- mother(X,Y).)を呼び出しました。私がmainを呼び出すと、少なくとも、私は関係に入り、結果を返し、そして閉じることをプログラムが待つだろうと期待していたでしょう。なぜこれは機能しませんか?

質問2:
どのように私は実際にメイン述語を書くのでしょうか?このようなプログラムの良い例はありますか?私は例hereを試しましたが、動作させることができませんでした。

ありがとうございました。

編集:
新しい試み - main. falseを返し、それが本当であるべきにもかかわらず、虚偽のmain.リターンを実行した後parent(tim, anna).権利を実行しています。

:- dynamic mother/2. 
:- dynamic father/2. 

family_func:- 
    assert(mother(tim, anna)). 
    assert(father(tim, bernd)). 

parent(X,Y) :- mother(X,Y). 
parent(X,Y) :- father(X,Y). 
ancestor(X, Y) :- parent(X, Y). 
ancestor(X, Y) :- parent(X, Z), ancestor(Z, Y). 

main:- 
    family_func. 

は編集:誰が知っている必要があり
念の
は、答えの下のコメント欄に@CapelliC状態として、呼び出しの間にコンマが必要です。たとえば:

family_func:- 
    assert(mother(tim, anna)), 
    assert(mother(anna, fanny)), 
    assert(mother(daniel, fanny)), 
    assert(mother(celine, gertrude)), 
    assert(father(tim, bernd)), 
    assert(father(anna, ephraim)), 
    assert(father(daniel, ephraim)), 
    assert(father(celine, daniel)). 
+2

ワンコメント: 'father_child/2 'と' parent_of/2、 'mother_child/2'を使用することを検討してくださいそれぞれの議論が何を意味するのかを明確に示す。これはあなたのコードを多く**より読みやすく**あなたと他の人のために考えることを容易にします。 Thes構文エラーは、ある述語の定義を他の述語に埋め込むことを試みることに起因しますが、これは不可能です。 – mat

答えて

2

私は(許可なしに空の引数リスト)あってはならないと思うの命名上の

:- dynamic mother/2. 
... other dynamically defined relations... 

family_func:- 
    assert(mother(tim, anna)). 
    ... 

% rules can be dynamic as well, it depends on your application flow... 
parent(X,Y) :- mother(X,Y). 
    ... 

main:- 
    family_func. 
+0

こんにちは。お返事をありがとうございます。私はまだメインを走らせると、実行中のコマンドを実行するのに問題が残っています。 main。を呼び出すと、falseが出力されます。次に、親(tim、anna)を実行しようとするとします。エラー:親/ 2:未定義手続き:母/ 2例外:(8)母親(tim、anna)? – JustBlossom

+0

': - dynamic mother/2.'宣言を忘れましたか? – CapelliC

+0

エラーが発生したバージョンでは、私は説明したばかりのまま残しました。それは、私がダイナミックを使用したときにすべてが偽を返したからです。私は私の質問に編集で試したことを入れました。 – JustBlossom