给出CNF逻辑公式
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="@android:dimen/thumbnail_height"
android:padding="16dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:orientation="vertical"
android:gravity="bottom"
android:background="@drawable/prxi"
android:id="@+id/linear">
<ViewFlipper
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/view_flipper">
</ViewFlipper>
</LinearLayout>
等于[[a, b, c], [b, d], [not(d), a]]
,如何使用prolog计算其模型(其原子的可能值为((a or b or c) and (b or d) and (not d or a))
)?这是我到目前为止所得到的:
公式的估值是os true
形式的术语列表,其中val(X,B)
是原子,X
是其值(0或1)。
关系B
由
value(X, Vs, B)
每当value(X, [val(X, B)|_], B) :− !.
value(X, [_|Ps], B) :− value(X, Ps, B).
是估值B
中原子X
的值时,及其为真。
由
给出的关系Vs
sp(F, Ss)
,只要sp([],[]).
sp([F|Fs], Ss) :- setof(A, member(A,F), R), sp(Fs, N), append(R,N,M), setof(B,member(B,M),Ss).
是逻辑公式F中的原子列表,就为真。
由
给出的关系Ss
valuation(As, Vs)
只要valuation([],[]).
valuation([A|As], [V|Vs]) :- (V = val(A,0); V = val(A,1)), valuation(As,Vs).
是原子列表Vs
的可能估值,就是这样。
我需要什么:
每当As
是公式时,ext(F, Vs, B)
关系为真,F
是该公式的可能估值,而Vs
是应用{的公式的值{1}}估值。例如,咨询
B
应返回值B = 1。
当评估Vs
是公式ext([[a], [not(b), c]] , [val(a, 1), val(b, 0), val(c , 1)], B).
的模型时,model(F,Vs)
关系为真。
只要Vs
是一个列表,哪个元素是公式F的模型,那么关系F
就是真的。我想我们需要在这里使用prolog的models(F, Ms)
。
最后,我不知道Ms
的最佳实现是什么让它发挥作用。我不知道是否应该指定setof
和val(X,B)
为真或仅val(_,1)
,知道要实施的其他关系会更好吗?
答案 0 :(得分:1)
不确定究竟是什么,但......
首先,让我尝试简化您的代码。
1)我认为您的value/2
应该写成
value(X, [val(X, B) | _], B).
value(X, [_ | Ps], B) :-
value(X, Ps, B).
2)我不明白你sp/2
的目的但在我看来可以简化为
sp([], []).
sp([[A] | Fs], [A | Ss]) :-
sp(Fs, Ss).
sp([[A | As] | Fs], [A | Ss]) :-
append(As, Fs, N),
sp(N, Ss).
3)我不明白你valutation/2
的目的但在我看来可以简化为
isBool(0).
isBool(1).
valuation([], []).
valuation([A | As], [val(A, B) | Vs]) :-
isBool(B),
valuation(As,Vs).
现在我尝试回答你的问题
4)
我需要[...]关系
的公式的值ext(F, Vs, B)
只要F
就是真的 是一个公式,Vs
是该公式的可能估值,B
是应用Vs
估值
我认为以下情况应该有效[谨慎:未经过多次测试]
ext([], _, 1).
ext([[] |_], _, 0).
ext([[X | L1] | L2], Vs, B) :-
value(X, Vs, 0),
ext([L1 | L2], Vs, B).
ext([[not(X) | L1] | L2], Vs, B) :-
value(X, Vs, 1),
ext([L1 | L2], Vs, B).
ext([[X | _] | L], Vs, B) :-
value(X, Vs, 1),
ext(L, Vs, B).
ext([[not(X) | _] | L], Vs, B) :-
value(X, Vs, 0),
ext(L, Vs, B).
5)
我需要[...]关系
的模型model(F,Vs)
无论什么时候都是真的 估值Vs
是公式F
以下情况如何?
model(F, Vs) :-
ext(F, Vs, _). % or ext(F, Vs, 1)?
6)
我需要[...]关系模型(F,Ms),只要Ms是a,它就是真的 列出哪些元素是公式F的模型
如果我理解你想要什么,给定model/2
,models/2
可以写成
models(_, []).
models(F, [Vs | Vl]) :-
model(F, Vs),
models(F, Vl).
7)
我不知道最好的val(X,B)实现是什么 工作。我不知道是否应该指定val(,1)和val(,0)为真 或只有val(_,1)
不确定理解你的问题。
val/2
对每个值都不成立;所以你不能强加真val(_,1)
和/或val(_,0)
,因为给定一个原子(例如a
)是真的val(a,1)
或 val(a,0)
,但val(X,1)
每个X
都是>>> i = ["", 1, 2]
>>> all([x for x in i])
False
。
答案 1 :(得分:0)
我可以在等待回复的同时完成它,并使用max66的答案对其进行改进。
我也接受了命题逻辑形式,因此models/2
接受两种风格(CNF和命题形式,基于运算符and
,not
,or
,{ {1}},我设置的imp
。
iff
我测试了它,似乎按预期工作。
答案 2 :(得分:0)
这里的另一种方法。转换为可执行文件Prolog,并具体执行特定执行(即具有特定符号绑定的证明):
ext(F, Vs, B) :-
or_list(F, [], C, Vs), !,
assign(Vs), ( call(C), B = true ; B = false ).
assign(Dict) :- maplist(domain, Dict).
domain(val(_, true)).
domain(val(_, false)).
or_list([A], D, T, Du) :-
!, and_list(A, D, T, Du).
or_list([A|As], D, ( T ; Ts ), Du) :-
and_list(A, D, T, Dut),
or_list(As, Dut, Ts, Du).
and_list([V], D, T, Du) :-
!, negation(V, D, T, Du).
and_list([V|Vs], D, ( T , Ts ), Du) :-
negation(V, D, T, Dut),
and_list(Vs, Dut, Ts, Du).
negation(not(V), D, \+T, Du) :-
!, sym_bind(V, D, T, Du).
negation(V, D, T, Du) :-
sym_bind(V, D, T, Du).
sym_bind(V, D, T, D) :-
memberchk(val(V, T), D), !.
sym_bind(V, D, T, [val(V, T)|D]).
请注意: