计算逻辑公式模型与prolog

时间:2016-08-28 15:19:03

标签: prolog

给出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的最佳实现是什么让它发挥作用。我不知道是否应该指定setofval(X,B)为真或仅val(_,1),知道要实施的其他关系会更好吗?

3 个答案:

答案 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/2models/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和命题形式,基于运算符andnotor,{ {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]).

请注意:

  • false / true而不是0/1
  • 列表到结构翻译:可能更短,使用foldl或DCG或传递运算符(即(;)/ 2(,)/ 2(+)/ 1),但这样Prolog模式应该是更清晰...