如何通过传递包含更多项目的列表来在prolog中显示规则

时间:2017-04-22 07:11:48

标签: prolog

我正在使用Prolog开发一个uni项目,我发现很难解释我的代码所以我只是在这里插入它(这不是我的项目的实际代码,但它的想法相同)

getlist1([H|T]):- read(X), not(X=end), H=X, getlist1(T).
getlist1([]).
getlist2([H|T]):- read(X), not(X=end), H=X, getlist1(T).
getlist2([]).


go:-write('select from the following:\n1.red 2.yellow 3.blue\n(type end if done)'),
     getlist1(R),sort(R,R2),
     write('select from the following:\n1.green 2.orange 3.pink\n(type end if done)'),
     getlist2(E),sort(E,E2),
     u(R2,E2).

u([1,2],[2]):-write('one').
u([1],[2,3]):-write('two').
u(_,_):-write('try again').

所以现在例如说用户输入1,2,3作为第一个列表 和第二个列表中的2,我想要显示第一个规则u([1,2],[2]),这可能吗?

1 个答案:

答案 0 :(得分:1)

以下似乎有效:

% getlist1/1 and getlist2/1 were the same so one getlist/1 is enough
getlist([H|T]):- read(H), H \== end, getlist(T).
getlist([]).

go:-write('select from the following:\n1.red 2.yellow 3.blue\n(type end if done)'),
     getlist(R),sort(R,R2),
     write('select from the following:\n1.green 2.orange 3.pink\n(type end if done)'),
     getlist(E),sort(E,E2),
     once(u(R2,E2)).

u([1,2|_],[2]):-write('one').
u([1],[2,3]):-write('two').
u(_,_):-write('try again').

只需添加|_,用户就可以在第一个列表中添加任意数字> 2,但仍会显示第一条规则。