3

私はswi-prologにプログラムを持っていて、演算子(?)->があります。これは初めて会ったもので、何をしているのかわかりません。私が理解していないコードの断片があります:

swf([PP->Q|F], [PP|L], X):- swf(F, L, X), axioms(X, PP->Q, F).

私たちが持っているときに私はそれを見つけました

X -> Y ; Z

次に、Xがtrueの場合、Yが実行され、それ以外の場合はZが実行されます。ただし、上記の場合にどのように機能するかはわかりません。

前もって感謝します。

編集:

正直なところ、これはアローの定理のコンピューター支援証明の一部であり(より正確には-基本ケース)、これはコード全体です(PROLOG、KenryoIndoによるアローの定理の証明から):

p(Q) :- permutation(Q, [a, b, c]).

p((X, Y), Q) :- p(Q), append(_, [X|B], Q), member(Y, B).

pp((Q1,Q2)) :- p(Q1), p(Q2).

all_pp(L) :- findall(QQ, pp(QQ), L).

axioms(arrow, V, F) :- p(Q), V=(PP->Q), pareto(V), iia(V, F).

swf([], [], _).
swf([PP->Q|F], [PP|L], X):- swf(F, L, X), axioms(X, PP->Q, F).
swf(F, X) :- all_pp(L), swf(F, L, X).

pp(XY, agree, (Q1,Q2)) :- p(XY, Q1), p(XY, Q2).
pp((X, Y), opposite, (Q1, Q2)) :- p((X, Y), Q1), p((Y, X), Q2).

pareto(PP->R) :- \+ (pp(XY, agree, PP), \+ p(XY, R)).

dictator(J, F) :- member(J:PP, [1:(P, _), 2:(_, P)]),
\+ (member(PP->R, F), pp(_, opposite, (P, R))).


agree(+, XY, QQ) :- pp(XY, agree, QQ).
agree(-,(X,Y), QQ) :- pp((Y, X), agree, QQ).

iia(PP->R, F) :- \+ (F \= [], pp(XY, A, PP), member(QQ->S, F),
pp(XY, A, QQ), \+ agree(_, XY, (R, S))).

それでも、どうやって扱うのかわからない->。X-> Yの使用法のチェーンがあります:swf-公理-パレートとswf-iia-メンバー。

4

1 に答える 1

4

Prologでは、演算子はネストされた用語の単なる構文糖衣です。

つまり、( is)/2と。には適切なop / 3宣言があるため、書く代わりに書くis(X, +(1,2))ことができます。別の話は、そのような用語に関連する解釈です。私の例に従うと、どこかに次のような句がありますX is 1+2+is(X, V) :- eval_expression(V, X).

これで、(->)/2はif/ then / else演算子(またはより良いif / then、elseは論理和演算子(;)/ 2)であり、ゴールとして使用される場合は、表示するコードは、おそらくパターンセレクターとして機能します。つまり、他の節swf / 3がある場合、公理/3がその式で呼び出される可能性があります。これは含意を意味していると思います。

HTH

ここで編集するのは、SWI-PrologIDEに配置されたときのコードの図です。構文の色は2つの問題を示しています。

  • 公理(矢印、V、F)のPPは使用されません
  • swf(F、X)が呼び出されることはありません(パラメーターが失われましたか?)

ここに画像の説明を入力してください

独裁者/2がエントリー節のようです。私は定理を知りません(私はドキュメントにアクセスできません)が、社会的実体についての予測を期待します。

PPはpareto/1で使用されるため、最初の問題は存在しません。本当の問題は、swfのパラメーターが欠落していることであり、のように読み取る必要がありますがswf(F, L, X) :- ...、ループが発生します。

于 2013-02-22T19:43:17.403 に答える