prolog“如何回答这个问题”

时间:2013-06-27 08:12:11

标签: prolog

a)编写一个谓词头/ 2(a r g l,arg2),它在argl中获取一个实例化的列表列表,并将arg2计算为子列表的头部列表。例如:

?- heads([[3, 8], [9], [1, 2, 3], [a, b, c]], L).    
L = [3, 9, l, a]

b)充分定义两个输入;整数和整数列表。结果是一个列表 通过将列表中的每个整数乘以输入整数形成的整数。例如:

?- mply(5, [1, 2, 3], X).    
X = [5, 10, 15]

c)编写一个名为compute(Expr,Value)的Prolog程序来计算 算术表达式Expr的值(值)。要求如下: •算术表达式可以是单个数字,也可以是[Exprl, 运营商,Expr2] •Exprl和Expr2是算术表达式 •运算符是原子加或原子减。 您的程序应该适用于以下查询:

?- compute(7, Val).
Val = 7

?- compute([2,plus,[9,minus,1]], Val).
Val = 10

我正在修改prolog,非常感谢任何帮助,谢谢

2 个答案:

答案 0 :(得分:1)

对于a)和b),您需要遍历列表并执行简单计算。常规列表遍历的工作原理如下:

list_traverse([]).
list_traverse([H|T]) :- list_traverse(T).

因此,通常您的解决方案应该将输入和输出添加到上面的模式中。

具体来说,对于a)

heads([],[]).
heads([H|T],[HH|TT]) :- H = [HH|_], heads(T,TT).

和b)

mply(_,[],[]).
mply(X,[H|T],[HH|TT]) :- HH is X*H, mply(X,T,TT).

c)需要稍微复杂一点的处理,因为你必须区分加法和减法:

compute([Val],Val) :- number(Val).
compute([E1,plus,E2],Val) :- compute(E1,V1), compute(E2,V2), Val is V1+V2.
compute([E1,minus,E2],Val) :- compute(E1,V1), compute(E2,V2), Val is V1-V2.

答案 1 :(得分:1)

ad a)计算空列表的头部是什么意思?我假设谓词应该失败:

:- use_module(library(lambda)).

list_heads(XXs, Xs) :-
   maplist(\[X|_]^X^true,XXs, Xs).

mply(F, Xs, Zs) :-
   maplist(F+\X^Z^(Z is X*F), Xs, Zs).

compute([I],Val) :-
   Val is I.
compute([E1,plus,E2],Val) :- compute(E1,V1), compute(E2,V2), Val is V1+V2.
compute([E1,minus,E2],Val) :- compute(E1,V1), compute(E2,V2), Val is V1-V2.

请注意,compute([_],V)现在会发出instantiation_error,这比默默地失败要好得多。