小さく始めて、知っていることを書き留めてください。
simplify(plus(times(x,y),times(3 ,minus(x,y))),V,[x:4,y:2]):- V = 14.
完全に良いスタートです: (+ (* 4 2) (* 3 (- 4 2))) = 8 + 3*2 = 14
. しかし、もちろん、
simplify(times(x,y),V,[x:4,y:2]):- V is 4*2.
はさらに優れています。また、
simplify(minus(x,y),V,[x:4,y:2]):- V is 4-2.
simplify(plus(x,y),V,[x:4,y:2]):- V is 4+2.
simplify(x,V,[x:4,y:2]):- V is 4.
すべて完全に優れた Prolog コードです。しかしもちろん、私たちが本当に意味することは明らかです。
simplify(A,V,L):- atom(A), getVal(A,L,V).
simplify(C,V,L):- compound(C), C =.. [F|T],
maplist( simp(L), T, VS), % get the values of subterms
calculate( F, VS, V). % calculate the final result
simp(L,A,V):- simplify(A,V,L). % just a different args order
などは、何らかの方法でリストgetVal/3
から値を取得し、シンボリック操作名と計算値のリストを指定して実際に計算を実行する必要があります。L
calculate/3
勉強maplist/3
して=../2
。
(未完成、未テスト)。
OK、maplist
これはやり過ぎでした=..
。すべての用語はおそらくop(A,B)
. したがって、定義は次のように簡略化できます
simplify(plus(A,B),V,L):-
simplify(A,V1,L),
simplify(B,V2,L),
V is V1 + V2. % we add, for plus
simplify(minus(A,B),V,L):-
% fill in the blanks
.....
V is V1 - V2. % we subtract, for minus
simplify(times(A,B),V,L):-
% fill in the blanks
.....
V is .... . % for times we ...
simplify(A,V,L):-
number(A),
V = .... . % if A is a number, then the answer is ...
そして最後の可能性は、x
またはy
その他を満たすことatom/1
です。
simplify(A,V,L):-
atom(A),
retrieve(A,V,L).
したがって、上記の節からの最後の呼び出しは のようretrieve(x,V,[x:4, y:3])
になるか、またはのようになりますretrieve(y,V,[x:4, y:3])
。実装するのは簡単なことです。