5

自由変数を含む単一の項を受け取り、それらの変数のマッピングのリストを返す述語を定義しようとしています。たとえば、データベースが

a(0,1).
a(1,1).

期待される出力は

?- eval(a(X,1),Maps).
Maps = [[[X,0]],[[X,1]]].
?- eval(a(X,Y),Maps).
Maps = [[[X,0],[Y,1]],[[X,1],[Y,1]]].

私はを使用してこれを達成しようとしていfindall/3ますが、自由変数とその可能な値を求める方法がわかりません。それが役に立ったら、私はswiprologを使用しています。ありがとう。

4

3 に答える 3

3

これが同様の問題の解決策です。[V,term]各変数のエントリを含むリストとして表される回答のリストの代わりに、クエリgoal_answers(Goal, Answerp)はペアを見つけますVars-Terms

goal_answerp(Goal, Answerp) :-
   term_variables(Goal, Vars),
   findall(Vars, Goal, Substs),
   Answerp = Vars-Substs.

?- goal_answerp(a(X,1), Ms).
Ms = [X]-[[0],[1]].

?- goal_answerp(a(X,Y), Ms).
Ms = [X,Y]-[[0,1],[1,1]].

[編集]回答を元の形式に戻すには、次を使用しますlibrary(lambda)

?- goal_answerp(a(X,1), Vs-Dss),
      maplist(Vs+\Ds^VDs^maplist(\V^D^[V,D]^true,Vs,Ds,VDs),Dss,VDss).
Vs = [X],
Dss = [[0],[1]],
VDss = [[[X,0]],[[X,1]]].

?- goal_answerp(a(X,Y), Vs-Dss),
      maplist(Vs+\Ds^VDs^maplist(\V^D^[V,D]^true,Vs,Ds,VDs),Dss,VDss).
Vs = [X,Y],
Dss = [[0,1],[1,1]],
VDss = [[[X,0],[Y,1]],[[X,1],[Y,1]]].
于 2011-07-20T15:19:59.210 に答える
2

やりたいことに問題があります。変数(X、Yなど)に付けたわかりやすい名前は、トップレベルのパーサーには知られていますが、プログラム内では「失われています」。このスニペットにはすべてのバインディングが一覧表示されますが、変数には一般的な名前が付けられます。

find_mappings(Template, Mappings):-
  term_variables(Template, Vars),
  find_mappings1(Vars, Mapping),
  findall(Mapping, Template, Mappings).

find_mappings1([], []).
find_mappings1([Var|Vars], [[Name,Var]|Mappings]):-
  term_to_atom(Var, Name),
  find_mappings1(Vars, Mappings).

?- find_mappings(a(X,Y), L).
L = [[['_G385', 0], ['_G386', 1]], [['_G385', 1], ['_G386', 1]]].

変数の固有名を受け取るために、プロシージャに別の引数を追加することをお勧めします。

find_mappings(Template, Names, Mappings):-
  term_variables(Template, Vars),
  find_mappings1(Vars, Names, Mapping),
  findall(Mapping, Template, Mappings).

find_mappings1([], [], []).
find_mappings1([Var|Vars], [Name|Names], [[Name,Var]|Mappings]):-
  find_mappings1(Vars, Names, Mappings).

?- find_mappings(a(X,Y), ['X', 'Y'], L).
L = [[['X', 0], ['Y', 1]], [['X', 1], ['Y', 1]]].
于 2011-07-20T15:03:39.833 に答える
0

目の前にインタプリタはありませんが、この特定のセットアップで「a」述語を使用してこれを実行できると思います。

var(X), 
var(Y), 
findall(U, 
  ( a(XSol,YSol), U=[[X,XSol], [Y,YSol]] ), 
  Maps).

(変数は不要かもしれません)しかし、なぜこのアプローチを問題に使用したいのかわかりません...

このようなことを行うための潜在的により良い方法については、 unizable/3をチェックしてください。

于 2011-07-20T15:18:35.760 に答える