swi-prolog真相任务?

时间:2015-04-08 22:24:08

标签: prolog

所以我有这个练习,我坚持:

公式为:

TRU

FLS

变量(V)iff V是原子。

或(Flist)iff列表中的每个元素都是公式

有暗示,也有暗示。表格看起来很相似。

我们可以通过形式为[Var1 / Value1,Var2 / Value2,... VarN / ValueN]的Prolog列表来表示真值赋值(赋值给变量)。写一个谓词子(?F,?Asst,?G),如果G是一个公式,则该公式是用来自赋值Asst的相应值替换F的变量的结果。 (您可以假设真值分配A至少部分实例化。)

E.g。

sub(variable(x), [x/tru], tru).
true
sub(or([variable(a),variable(b)]), [a/tru,b/fls], G).
G = or(tru,fls)
true

我试过

sub(variable(x),[x/value],G):-
    G = variable(value).

但它只是返回false。

编辑:对不起我没有说清楚问题,有人可以向我解释是否有办法将列表中的变量相关联的值分配给另一个变量?我认为这与统一有关。

1 个答案:

答案 0 :(得分:1)

变量是占位符。

注意区分大小写:Prolog变量名以大写字母或下划线开头,小写字符以小写字母开头。

sub/3的代码段假定列表为。{1}} 键值对完全长度[x/value])。 通过使用member/2,列表可以具有任意长度。

在处理像and / or这样的n-ary逻辑连接词时,您可能希望尽快返回短路实现。像这样:

sub(tru,_,tru).
sub(fls,_,fls).
sub(variable(X),Assoc,Value) :-
    member(X/Value,Assoc).
sub(or([]),_,fls).
sub(or([X|Xs]),Assoc,V) :-
    sub(X,Assoc,T),
    (  T = tru, V = tru              % short-circuit logical-or
    ;  T = fls, sub(or(Xs),Assoc,V)
    ).