2016-05-08 4 views
2

私はProlog Tutorial 2.1の後にいます。Prolog:変数の可能な値をすべて取得する

プログラム

adjacent(1, 2). 
adjacent(1, 3). 
adjacent(1, 4). 

main:- 
    adjacent(1, R), 
    write(R). 

プリント2

しかし、それは、チュートリアルに従って、可能な値のリストを印刷するには想定:

?- adjacent(1,2). 
yes 
?- adjacent(1,3). 
no 
?- adjacent(1,R). 
R = 2 ; 
R = 3 ; 
R = 4 ; 
no 

私は同じ結果を得るために、REPLに再度お試し:

?- adjacent(1, R). 
R = 2 . 

はどうやって得ることができます/変数の可能な値のリストを出力しますか? swiplで

+1

あなたはを返しました。返信Spaceを押すと、次の回答が得られます。 – false

+0

'adjacent(1,3).'は' yes'になります。あなたが目に見えない、まともなことをしていないことがあります。 – lurker

+0

@false私はreplで作成しますが、 'swipl -q -f Adjacent.pl -t main'のようなスクリプトとしてプログラムを実行すると、その価値をどのように得ることができますか? – Wentao

答えて

0

、ライブラリ(apply)がある - デフォルト - 自動ロード、あなたが

 
main:- 
    forall (adjacent(1, R), (write(R),nl)). 

のメモを書くことができるように:アクションは必要な適切な構文を説明するためだけに、接続詞です。実用的な目的のためには、main :- forall(adjacent(1, R), writeln(R)).が良いかもしれません。

0

あなたは、障害ループを必要とする:

adjacent(1, 2). 
adjacent(1, 3). 
adjacent(1, 4). 

main :- 
    adjacent(1, R), 
    write(R), nl, 
    fail. 
main. 

これはプロローグで、基本的なプログラミング技術です。失敗/ 0はバックトラッキングを強制するので、次に隣接する/ 2の解を探索する(など)。 2番目の句をmain/0にすると、ループ自体が失敗することはありません。

関連する問題